提前看目錄
1、設定監視哨的順序查詢
2、折半查詢
3、分塊查詢
普通的順序查詢就是利用迴圈遍歷,例如n個資料查詢,利用for(i=n;i>0;i--)迴圈,在進行if語句的判斷,我們會發現每一次都會執行i>0的判斷,而實際上只要存在這個元素,都是滿足這個條件的,所以這就增加了時間的複雜度。因此就有了設定監視哨的順序查詢,簡單來說就是將n[0]存放要查詢的元素,這樣就一定可以找得到(即查詢成功返回下標,失敗下標返回為0),就不需要去判斷i>0,從而減少了時間複雜度。
【演算法描述】
int search_seq(sstable st,keytype key)
【演算法分析】雖然只是程式設計技巧上的改進,即通過設定監視哨,免去查詢過程中每一步都要檢測整個表是否查詢完畢。而然實踐證明,整個改進能使順序查詢在st.lenth>=1000時,查詢平均時間幾乎減少一半。
這般查詢也是很基礎的(前提有序表),所以我們可以直接將演算法給出複習一下。
【演算法描述】
int search_bin(sstable st,keytype key)
{//在有序表st中折半查詢其關鍵字等於key的資料元素。若找到,則函式值為該元素在表中的位置,否則為0
low = 1;high = st,length;//置查詢區間初值
while(low<=high)
{mid=(low+high)/2;
if(key==st.t[mid].key) return mid;//找到待查詢元素
else if(key當然啦,聰明的你一定也發現了這個其實也可以用遞迴來寫,一起看看。
int search_bin(sstable st,keytype key,int low,int high)
{ mid = (low+high)/2;
if(key==st.t[mid].key) return mid;
else if(key【演算法分析】
折半查詢也可用二叉樹來描述。把當前查詢區間的中間位置作為根,左子表和右子表分別作為根的左子樹和右子樹,由此得到的二叉樹成為折半查詢的判定樹。這樣的時間複雜度可以降到log2n+1,比之前的o(n)要小很多。
比如有資料:12
3456
78910
1151620
2730
3644
5560
6771
判定數就為:
分塊查詢又稱索引順序查詢,其實很好理解,就是將資料分為幾部分,每部分之間是有序的,而內部是無序的(塊間有序,塊內無序)。這樣我們思考到可以用二分查詢索引表,而用順序查詢塊內元素,時間複雜度也很小,而且由於塊內的元素無序,這樣我們進行元素的插入刪除就很方便。
例如:
這樣作為動態查詢表是很適合的。
後記:打好基礎,衝衝衝!
線性查詢 順序,二分,分塊 1
1.include using namespace std 順序查詢 int ordersearch int list,int length,int key 如果掃瞄完,說明沒有元素的值匹配key,返回 1,表示查詢失敗 return 1 int main int result ordersearc...
查詢演算法 順序查詢 二分查詢 分塊查詢
近期總結了各大排序演算法的原理 並對其進行了實現,想著一併把查詢演算法總結了,今天就著手開始總結查詢演算法。關鍵字與陣列中的數順序比較,時間複雜度o n void cgradationdlg onbutfind else if n 10 updatedata false 二分查詢又稱折半查詢,優點是...
資料結構(順序查詢 二分查詢 分塊查詢)
一 查詢 概念 給定乙個值k,在含有n個記錄的檔案中進行搜尋,尋找乙個關鍵字值等於k的記錄,如找到則輸出該記錄,否則輸出查詢不成功的資訊。二 靜態查詢表 順序查詢 2 折半查詢 折半查詢比順序查詢的效率要高,但它要求查詢表進行順序儲存並且按關鍵字有序排列,因此對錶進行元素的插入和刪除時,需要移動大量...