靜態查找算法
數據集合穩定,不須要添加,刪除元素的查找數組
對於靜態查找:能夠用線性表結構組織數據,這樣即可使用順序查找算法,若是再對關鍵字進行排序,則可以使用折半查找法或斐波那契查找法等來提升效率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 }
線性索引查找
.
分塊索引
倒排索引
根據屬性值來查看記錄;