我所謂的分段查詢包括:二分查詢、插值查詢、fibonacci查詢。
三者都是不斷的縮小查詢範圍的查詢方法,只是在每次縮小多少範圍上有所區別。
二分查詢:
最簡單,每次一刀切,切一半,相對於其他兩種方法顯得很籠統,但是適配性不錯,沒有特殊限制。
int binary_search(int *a,int n,int key)
else if(key > a[mid])
else
}return 0;
}
插值查詢:
如果查詢的資料分布呈等差數列,那麼這種方式會比較好。
int interpolation_search(int *a,int n,int key)
else if(key > a[mid])
else
}return 0;
}
特色在於如何計算中間值。他假設所有資料都是等值分布的,和他們的下標是成比例的,所以才會計算,目標值佔最大和最小值的差值的比例,並乘以下標差。
fibonacci查詢:
這個查詢不在做任何假設,他利用了fibonacci數列的相鄰兩個值在不斷擴大的特性,來先大後小的不斷縮減查詢範圍。
**中求中值用到了fibonacci數列的f[k] = f[k-1] + f[k-2]的特色。
/*
借用fibonacci數列逐步遞增範圍的特性,來劃分查詢的範圍
*/int fibonacci_search(int *a,int n,int key)
for(i=n;ia[mid])
/*key == a[mid]*/
else
else
}} return 0;
}
難點在於如何理解,high = mid - 1時,k = k -1;而low = mid + 1時,k = k - 2。
關鍵在於還剩多少,排除在查詢範圍外的有多少,理清了這個,也就搞清楚了為什麼high = mid - 1時,k = k -1;而low = mid + 1時,k = k - 2了。
大話資料結構之 分塊索引
稠密索引因為索引項和資料集的記錄個數相同,所以控制項代價很大。為了減少索引項的個數,我們可以對資料集進行分塊,使其分塊有序,然後再對每一塊建立乙個索引項,從而減少索引項的個數。分塊有序,是把資料集的個數分成了若干塊,並且這些塊需要滿足兩個條件 對於分塊有序的資料集,將每塊對應乙個索引項,這種索引方法...
大話資料結構筆記 查詢
查詢就是根據給定的某個值,在查詢表中確定乙個其關鍵字等於給定值的資料元素 或記錄 查詢表是由同一型別的資料元素 或記錄 構成的集合。關鍵字 key 是資料元素中某個資料項的值。若此關鍵字可以唯一的表示乙個記錄,則稱此關鍵字為主關鍵字 primary key 對於那些可以識別多個資料元素 或記錄 的關...
資料結構 靜態查詢之分塊查詢
分塊查詢 分塊查詢,也稱索引順序查詢,是一種折半查詢和順序查詢的改進方法。思想 把線性表分成若干塊,每塊包含若干個元素 塊內無序,塊間有序。建立乙個索引表,把每塊中的最大關鍵字值和每塊的第乙個元素在表中的位置和最後乙個元素在表中的位置存放在索引項中。先確定待查資料元素所在的塊,然後再塊內順序查詢 如...