數據結構(查找)

靜態查找算法

  數據集合穩定,不須要添加,刪除元素的查找數組

  對於靜態查找:能夠用線性表結構組織數據,這樣即可使用順序查找算法,若是再對關鍵字進行排序,則可以使用折半查找法或斐波那契查找法等來提升效率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 }

線性索引查找

 

  • 稠密索引:文件每一個搜索碼值都對應索引值,即爲數據記錄文件的每一條記錄設一個(鍵——指針)對。
  • 如圖:索引項包括索引值以及指向該搜索碼的第一條數據記錄的指針
  • 缺點:所佔空間較大,若數據量較大時不太適合

.

分塊索引

  • 爲減少索引項的個數,對數據表進行分塊,使其分塊有序
  • 對每一塊創建一個索引項
  • 須要注意的是各塊間有序,塊內數據無序

倒排索引

  根據屬性值來查看記錄;

相關文章
相關標籤/搜索