查詢1 線性表的查詢(順序 二分 分塊)

2021-10-01 03:55:43 字數 1655 閱讀 1096

提前看目錄

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 折半查詢 折半查詢比順序查詢的效率要高,但它要求查詢表進行順序儲存並且按關鍵字有序排列,因此對錶進行元素的插入和刪除時,需要移動大量...