数据结构(查找)

Posted tianliang-2000

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构(查找)相关的知识,希望对你有一定的参考价值。

静态查找

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

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

动态查找

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

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


 

顺序查找:

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

 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;
}

折半查找法

  二分法搜索:确定待查找范围,缩小范围【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("循环
");
 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("循环
");
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 }

线性索引查找

 

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

技术图片.

分块索引

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

技术图片

倒排索引

  根据属性值来查看记录;

 

以上是关于数据结构(查找)的主要内容,如果未能解决你的问题,请参考以下文章

记录C#常用的代码片段

如何使用导航架构组件查找子片段

如何创建片段以重复变量编号中的代码行

以下代码片段的时间复杂度是多少?

在片段中,如何查找活动布局中定义的视图?

在片段中查找ViewById