本博客整理了当前经典的搜索算法的实现,并进行了简单的分析;博客中所有的代码实现位于:https://github.com/yaowenxu/codes/tree/master/搜索算法 ; 如果代码对您有帮助,希望能点击star~基于推荐和鼓励!感谢~
基本概念:
- 搜索:就是在指定结构内,找到满足条件的关键字;这个结构可以是查找表结构,也可以是树结构也可以是图结构;
- 查找表:带有相同种类键值的元素所构成的集合;
- 关键字:元素中的某一项数字和标识,一个数据可以有很多关键字,可以通过多种维度来进行搜索;
- 主键:可以用来唯一标识数据或者记录的关键字;
- 静态查找表:查询某个特定的元素是否在表中;只做查找操作,查找过程中集合中的数据不发生变化;
- 动态查找表:在查找过程中,同时进行插入或者删除数据;
- 内查找:全部过程中都在内存中进行,为内查找;
- 外查找:全部过程中需要访问外存,为外查找;
- 性能评价:ASL(Average Search Length),平均比较长度;表示在查找过程中对关键字的需要执行的平均比较长度(平均比较次数),来进行评价算法性能优劣;
- 查找算法选取:判断当前数据的组织结构,是线性表还是树结构还是图结构;如果是顺序表,还要考虑表格中的数据是否有序;
顺序查找:顺序查找的思想是从左到右依次进行扫描比较,如果满足指定的查找条件则查找成功,若到末尾还未找到,则数组中无满足结构,适合与线性表;数据可以有序也可以无序;
#define DEBUG 1 #include <iostream> #include <cstdio> #include <vector> using namespace std; void printarray(vector<int> &arr); void seqsearch(vector<int> &arr, int v=500){ cout << "开始查找数据:" << v << endl; bool flag = true; for (int i = 0; i < arr.size(); i++) { if(arr[i] == v){ cout << "满足索引:" << i << endl; flag = false; } } if (flag) { cout << "无满足数据!" << endl; } } // 打印函数; void printarray(vector<int> &arr){ for(int i = 0; i < arr.size(); i++){ cout << arr[i] << " "; } cout << endl; } int main(){ vector<int> arr; freopen("in.txt", "r", stdin); // 重定向到输入 int i = 0; int tmp; while (cin >> tmp) { arr.push_back(tmp); // cout << inarray[i] << endl; i++; } int num = i; cout << "输入数据:" << endl; printarray(arr); cout << endl; if (DEBUG){ cout << "查找过程:" << endl; } // 顺序查找 seqsearch(arr); return 0; }