数据结构(查找)

静态查找算法

  数据集合稳定,不须要添加,删除元素的查找数组

  对于静态查找:能够用线性表结构组织数据,这样即可使用顺序查找算法,若是再对关键字进行排序,则可以使用折半查找法或斐波那契查找法等来提升效率app

动态查找spa

  数据集合在查找的过程当中须要同时添加或删除元素的查找指针

  对于动态查找:可考虑使用二叉排序树的查找技术,另外还可以使用散列表结构来解决一些查找问题code


 

顺序查找:blog

  从第一个(或最后一个)记录开始,逐个进行记录的关键字和给定值进行比较排序

 1 //顺序查找,a为要查找的数组;n为数组长度,key为查找的关键字
 2 int Sq_Search(int *a,int n,int key){
 3     int i;
 4     for(i=0;i<=n;i++){
 5         if(a[i]==key){
 6             return i;
 7         }
 8     }
 9     return 0;
10 }

因为每次循环都要判断两次,因此能够考虑添加一个“哨兵”来承担监视越界的问题省去一次判断,这样效率就可提升一倍;索引

//顺序查找,a为要查找的数组;n为数组长度,key为查找的关键字
int Sq_Search(int *a,int n,int key){
    int i=n-1;
    a[0]=key;
    while(a[i]!=key)
        i--;
    return i;
}

折半查找法class

  二分法搜索:肯定待查找范围,缩小范围【O(Log₂n)】

差值查找法

  原理:按照数据分布的数据差值比例,按这个比例来决定下一次查找位(关键是差值要按比例分布)

  按比例查找:与折半查找法类似(只不过将二分改成了按比例查而已)

  例如:再字典中查找apple不会用折半查找法,而是差值查找法

 1 int bin_search(int a[],int n,int key){
 2     int low=0,high=n-1,mid;
 3     while(low<=high){
 4         printf("循环\n");
 5         //中心思路是:key下标/查找范围≈key/范围边缘两值的差;根据这种思想,不断缩短范围直到查找到key
 6         mid=low+(key-a[low])/(a[high]-a[low])*(high-low);
 7         if(a[mid]==key)
 8             return mid;
 9         else if(a[mid]<key)//说明key在mid的右边
10             low=mid+1;
11         else//说明key在mid左边
12             high=mid-1;
13     }
14     return -1;
15 }

斐波那契查找

  斐波那契数列(F[k]):1,1,2,3,5,8,13,21,34,...(先后两个数比重逐渐接近:0.618)

  因此利用斐波那契把差值查找中的比例改成不断接近0.618的比例就叫斐波那契查找法;

 1 #define MAXSIZE 20
 2 
 3 int bin_search(int a[],int n,int key){
 4     int low=0,high,mid;
 5     int i=1,j=1,k=2;
 6     int f[MAXSIZE]={1,1};
 7     while(f[k]<n&&j<MAXSIZE){
 8         k++;
 9         f[k]=f[i]+f[j];
10         i=f[j];
11         j=f[k];
12     }
13     high=f[k];
14     while(low<=high){
15         printf("循环\n");
16         mid=f[k-1];
17         if(a[mid]==key)
18             return mid;
19         else if(a[mid]<key){//说明key在mid的右边
20             low=mid+1;
21             k-=2;
22             mid=f[k-1];
23         }else{//说明key在mid左边
24             high=mid-1;
25             k-=1;
26             mid=f[k-1];
27         }
28     }
29     return -1;
30 }

线性索引查找

 

  • 稠密索引:文件每一个搜索码值都对应索引值,即为数据记录文件的每一条记录设一个(键——指针)对。
  • 如图:索引项包括索引值以及指向该搜索码的第一条数据记录的指针
  • 缺点:所占空间较大,若数据量较大时不太适合

.

分块索引

  • 为减少索引项的个数,对数据表进行分块,使其分块有序
  • 对每一块创建一个索引项
  • 须要注意的是各块间有序,块内数据无序

倒排索引

  根据属性值来查看记录;

相关文章
相关标签/搜索