静态查找表:只作查找操作的查找表(顺序查找、折半查找)

动态查找表:在查找过程中,同时插入新元素或删除旧元素(二叉排序树)

1.顺序查找表

  1. int SequentialSearch(int *a,int n,int key){  
  2.     int i;  
  3.     for(i=1;i<=n;i++){//从1开始   
  4.         if(a[i] == key){  
  5.             return i;  
  6.         }  
  7.     }  
  8.     return 0;  
  1. int SequentialSearch(int *a,int n,int key){  
  2.     int i;  
  3.     a[0] = key;//a[0]当做哨兵 ,不用每次都检查越界问题   
  4.     i = n;//循环从尾部开始   
  5.     while(a[i] == key){  
  6.         i--;  
  7.     }  
  8.     return i;  
  9. }  

2.有序查找表

 

  1. int BinarySearch(int *a,int n,int key){//折半查找时间复杂度O(logn)   
  2.     int mid,high,low;//需要有序表顺序存储,适合静态查找表   
  3.     low = 1;  
  4.     high = n;  
  5.     while(low<=high){//主循环   
  6.         mid = (low + high)/2;  
  7.         if(key>a[mid]){  
  8.             low = mid + 1;  
  9.         }  
  10.         else if(key<a[mid]){  
  11.             high = mid -1;  
  12.         }  
  13.         else{  
  14.             return mid;  
  15.         }  
  16.     }  
  17.     return 0;  
  18. }  

 

  1. int BinarySearch(int *a,int n,int key){//插值查找时间复杂度O(logn)   
  2.     int mid,high,low;//核心是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法   
  3.     low = 1;  
  4.     high = n;  
  5.     while(low<=high){//主循环   
  6.         mid = low + (high - low) * (key - a[low])/(a[high] - a[low]);//关键步骤!   
  7.         if(key>a[mid]){  
  8.             low = mid + 1;  
  9.         }  
  10.         else if(key<a[mid]){  
  11.             high = mid -1;  
  12.         }  
  13.         else{  
  14.             return mid;  
  15.         }  
  16.     }  
  17.     return 0;  
  18. }  

3.线性索引查找

索引:把一个关键字和与它对应的记录相关联的过程

1)稠密索引:将数据集中的每一个记录对应一个索引项,索引项一定是按照关键码有序排列的

2)分块索引:把数据集分成若干块,块内无序块间有序。

索引结构为最大关键码是存储每一块中的最大关键字,下一块中的最小关键字也能比这一块最大的关键字要大;块数是记录块中的记录个数;块首指针是指向块首数据元素的指针

步骤是在分块索引中查找关键字所在的块

之后在块中使用顺序查找

4.倒排索引

索引结构是次关键码、记录号码表。其中记录号表存储具有相同关键字的记录的记录号