静态查找表:只作查找操作的查找表(顺序查找、折半查找)
动态查找表:在查找过程中,同时插入新元素或删除旧元素(二叉排序树)
1.顺序查找表
- int SequentialSearch(int *a,int n,int key){
- int i;
- for(i=1;i<=n;i++){//从1开始
- if(a[i] == key){
- return i;
- }
- }
- return 0;
- }
- int SequentialSearch(int *a,int n,int key){
- int i;
- a[0] = key;//a[0]当做哨兵 ,不用每次都检查越界问题
- i = n;//循环从尾部开始
- while(a[i] == key){
- i--;
- }
- return i;
- }
2.有序查找表
- int BinarySearch(int *a,int n,int key){//折半查找时间复杂度O(logn)
- int mid,high,low;//需要有序表顺序存储,适合静态查找表
- low = 1;
- high = n;
- while(low<=high){//主循环
- mid = (low + high)/2;
- if(key>a[mid]){
- low = mid + 1;
- }
- else if(key<a[mid]){
- high = mid -1;
- }
- else{
- return mid;
- }
- }
- return 0;
- }
- int BinarySearch(int *a,int n,int key){//插值查找时间复杂度O(logn)
- int mid,high,low;//核心是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法
- low = 1;
- high = n;
- while(low<=high){//主循环
- mid = low + (high - low) * (key - a[low])/(a[high] - a[low]);//关键步骤!
- if(key>a[mid]){
- low = mid + 1;
- }
- else if(key<a[mid]){
- high = mid -1;
- }
- else{
- return mid;
- }
- }
- return 0;
- }
3.线性索引查找
索引:把一个关键字和与它对应的记录相关联的过程
1)稠密索引:将数据集中的每一个记录对应一个索引项,索引项一定是按照关键码有序排列的
2)分块索引:把数据集分成若干块,块内无序块间有序。
索引结构为最大关键码是存储每一块中的最大关键字,下一块中的最小关键字也能比这一块最大的关键字要大;块数是记录块中的记录个数;块首指针是指向块首数据元素的指针
步骤是在分块索引中查找关键字所在的块
之后在块中使用顺序查找
4.倒排索引
索引结构是次关键码、记录号码表。其中记录号表存储具有相同关键字的记录的记录号
转载于:https://blog.51cto.com/fanaticssk/841112