实现顺序查找表
- 1.上机名称
- 2.上机要求
- 3.上机环境
- 4.程序清单(写明运行结果及结果分析)
- 4.1 程序清单
- 4.1.1 头文件
- 4.1.2 实现文件
- 4.1.3 源文件
- 4.2 实现展效果示
- 上机体会
1.上机名称
实现顺序查找表
-
顺序查找表的基本概念
顺序查找表是一种线性数据结构,通常用于存储一组元素。这些元素在表中按顺序排列,查找操作通过逐个比较表中的元素来实现。顺序查找表适用于小规模数据或不需要频繁查找的场景。 -
顺序查找表的特点
顺序查找表的主要特点是其简单性和直接性。由于元素是按顺序存储的,查找操作需要从表的一端开始,逐个比较元素,直到找到目标元素或遍历完整个表。这种查找方式的时间复杂度为 O(n),其中 n 是表中元素的数量。 -
顺序查找表的实现
顺序查找表可以通过数组或链表来实现。数组实现的顺序查找表在内存中是连续存储的,而链表实现的顺序查找表则通过指针链接各个元素。
顺序查找表的优缺点
顺序查找表的优点是实现简单,插入操作的时间复杂度为 O(1)。缺点是查找操作的时间复杂度较高,为 O(n),尤其是在数据量较大的情况下,查找效率较低。 -
顺序查找表的应用场景
顺序查找表适用于数据量较小、查找操作不频繁的场景。例如,在小型缓存系统或简单的任务队列中,顺序查找表可以提供足够的性能。 -
顺序查找表的优化
为了提高顺序查找表的查找效率,可以采用一些优化策略,如将频繁访问的元素移动到表的前面,或者使用二分查找等更高效的查找算法。然而,这些优化通常需要额外的存储空间或更复杂的数据结构。
2.上机要求
(1)实现无序的顺序查找表,实现插入键值对、按照关键字查询、删除记录等操作
(2)实现有序的顺序查找表,实现插入键值对、按照关键字查询、删除记录等操作
3.上机环境
visual studio 2022
Windows11 家庭版 64位操作系统
4.程序清单(写明运行结果及结果分析)
4.1 程序清单
4.1.1 头文件
#pragma once
#include<iostream>
#include<string>
#define MAX_LEN 64
using namespace std;
//在此项目里,默认采用从大到小的排序顺序
typedef std::string Key; //键
typedef std::string Value; //值
enum Type {_ORDER, DIS_ORDER
};
//Node结构体包含两个成员变量:key和val,分别用于存储键和值。
struct Node{Key key;Value val;
};class Record {
public:Record(int flag); //用于初始化Record对象,flag表示记录是有序还是无序。~Record();void push(Key key, Value val); //用于将键值对添加到记录中。void search(Key key); //用于查找指定键的记录。void search(); //用于交互式查找记录。void erease(Key key); //用于删除指定键的记录。void printinfo(int i); //用于打印指定索引的记录信息。void searchkey(int low, int high, Key key);//用于在指定范围内查找键。void view(); //用于查看所有记录。int getsize(); //用于获取当前记录的数量。
private:Node* base; //基址int curlen; //现有长度int maxlen; //空间尺度int flag; //标记是无序还是有序
};
4.1.2 实现文件
#include "Sq_Search.h"
Record::Record(int flag){this->curlen = 0;this->maxlen = MAX_LEN;this->base = new Node[maxlen];memset(base, 0, sizeof(base));this->flag = flag;
}Record::~Record(){delete[]base;this->curlen = 0;this->maxlen = 0;
}void Record::push(Key key, Value val){if (curlen + 1 > maxlen) {Node* fresh = new Node[maxlen * 2];maxlen *= 2;memset(fresh, 0, sizeof(fresh));for(int i =0;i<curlen;i++){fresh[i].key = base[i].key;fresh[i].val = base[i].val;}delete[]base;base = fresh;}switch (flag){case _ORDER: {int i = 0;while (base[i].key.compare(key) > 0&&i<curlen) i++;int cord = i;for (i = curlen; i > cord && i > 0; i--) {base[i] = base[i - 1];}base[cord].key = key;base[cord].val = val;++curlen;break;}case DIS_ORDER: {base[curlen].key = key;base[curlen].val = val;++curlen;break;}default: {cout << "No Type!" << endl;exit(1);break;}}
}void Record::search(Key key){switch (flag){case _ORDER: {searchkey(0,curlen-1,key);break;}case DIS_ORDER: {int i = 0;while (i < curlen && base[i].key.compare(key))i++;if (i == curlen)cout << "Can't find key!" << endl;else printinfo(i);break;}default:exit(3);break;}
}void Record::search(){cout << "please enter a key to search>>" << endl;string str;cin >> str;search(str);
}void Record::erease(Key key){int i = 0;while (i < curlen && base[i].key.compare(key))i++;if (i == curlen)cout << "Can't find key!" << endl;else {for (int j = i; j < curlen; j++) {base[j].key = base[j + 1].key;base[j].val = base[j + 1].val;}--curlen;cout << "Erease " << key << ">>" << endl;}
}void Record::printinfo(int i){cout << base[i].val << endl;
}void Record::searchkey(int low, int high,Key key){int mid = (low + high) / 2;if (mid >= high && base[mid].key.compare(key)) { cout << "Can't find key!" << endl; return; }if ( base[mid].key.compare(key) == 0) { printinfo(mid); return; }if ( base[mid].key.compare(key) < 0) { searchkey(low, mid - 1, key); }if ( base[mid].key.compare(key) > 0) { searchkey(mid + 1, high, key); }
}void Record::view(){for (int i = 0; i < curlen; i++) {cout <<base[i].key<<"\t--\t";printinfo(i);}
}int Record::getsize(){return curlen;
}
4.1.3 源文件
#include"Sq_Search.h"
int main() {Record order = Record(_ORDER);Record disorder = Record(DIS_ORDER);order.push("hello", "你好");order.push("world", "世界");order.push("push", "插入");order.push("int", "整型");order.push("max", "最大");order.push("min", "最小");order.push("float", "浮点型");disorder.push("hello", "你好");disorder.push("world", "世界");disorder.push("push", "插入");disorder.push("int", "整型");disorder.push("max", "最大");disorder.push("min", "最小");disorder.push("float", "浮点型");cout << "view order:\n";order.view();cout << "view disorder:\n";disorder.view();order.search("hello");disorder.search("world");order.erease("hello");order.view();order.search();
}
4.2 实现展效果示
上机体会
通过这次实验,我深刻认识到理论知识和实践经验的重要性。在实现顺序查找表的过程中,我不仅掌握了基本的算法知识,还学会了如何优化代码以提高性能。此外,通过对比不同查找方法,我了解了各种方法的优缺点,为未来的应用开发提供了参考。
尽管顺序查找表在某些场景下仍有应用价值,但在大规模数据集上,其性能表现并不理想。因此,在实际应用中,我们需要根据具体需求选择合适的查找方法。对于需要频繁查找的数据,可以考虑使用哈希查找等高效算法。而对于只需在小规模数据上完成简单查找的任务,顺序查找表仍是一种简单、可靠的选择。
在无序查找表中,查找时间复杂度为O(n),在有序查找表中,查找时间复杂度为O(log n)对于数据量大的情况,显然有序表更占优势。