順序查詢 二分查詢 索引查詢

2022-06-11 15:24:11 字數 2064 閱讀 7525

1.查詢技術的分類。如下圖:

2.什麼是順序查詢呢?(無序表)

順序查詢的原理很簡單,就是遍歷整個列表,逐個進行記錄的關鍵字與給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄。如果直到最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢失敗。

時間複雜度是o(n)

3.二分查詢(前提就是有序表)

二分查詢的基本思想是:

在有序表中,取中間記錄作為比較物件,若給定值與中間記錄的關鍵字相等,則查詢成功;若給定值小於中間記錄的關鍵字,則在中間記錄的左半區繼續查詢;若給定值大於中間記錄的關鍵字,則在中間記錄的右半區繼續查詢。不斷重複上述過程,直到找到為止。

從二分查詢的定義我們可以看出,使用二分查詢有兩個前提條件:

(1)待查詢的列表必須有序(通常是從小到大的順序)。

(2)必須使用線性表的順序儲存結構來儲存資料(底層用陣列實現的)。

時間複雜度是o(logn),可以看到遠遠好於順序查詢的o(n)

public class binsearchelse

if(min>max)

return -1;

mid=(max+min)/2;

}return mid;

} public static void main(string args);//有序的,從小到大排的

int index=halfsearch(arr,7);//要查詢7,返回的是索引值

system.out.println(halfsearch(arr,7));

}}

4.索引查詢 

關於索引,我們很容易地聯想到資料庫中的索引,建立了索引,可以大大提高資料庫的查詢速度。

索引查詢又稱為分塊查詢,是一種介於順序查詢和二分查詢之間的一種查詢方法。

分塊查詢的基本思想是:

首先查詢索引表,可用二分查詢或順序查詢(因為塊間是有序的,可以用二分查詢),

然後根據塊首指標找到相應的塊,並在確定的塊中進行順序查詢。

滿足兩個條件:

(1)塊內無序,每一塊內的記錄不要求有序。

(2)塊間有序,如第二塊記錄的所有關鍵字要大於第一塊,第三塊的要大於第二塊

分塊查詢的時間複雜度為o(√n)。

在實現索引查詢演算法前需要弄清楚以下三個術語。

(1)主表。即要查詢的物件。

(2)索引項。一般我們會將主表分成幾個子表,每個子表建立乙個索引,這個索引就叫索引項。

(3)索引表。即索引項的集合。

同時,索引項包括以下三點。

(1)最大關鍵碼,就是儲存的每一塊中的最大關鍵字(那一塊中數字最大的那個)

(2)塊長,就是每一塊的元素個數

(3)塊首指標,就是每一塊第乙個元素的指標

栗子1:

有個長度為12的無重複有序表,按折半查詢法進行查詢,在表內各元素等概率情況下,查詢成功所需的平均比較(三元比較)的次數為(37/12)

解釋:此題按照一顆完全二叉樹來考慮,12個結點是4層,所以為(1*1+2*2+4*3+5*4)/12

栗子2:

有如下乙個類似跳表的資料結構:每層都是已經排好序的鍊錶,level1層的鍊錶有所有元素,leveln層的鍊錶只有leveln-1的1半的元素,leveln層的結點指向leveln-1層中相同的結點。請問查詢乙個元素的時間複雜度是:

解釋:這是乙個類似二分查詢的演算法:時間複雜度o(logn)

二分查詢時間複雜度計算:

總共有n個元素,

漸漸跟下去就是n,n/2,n/4,....n/2^k,其中k就是迴圈的次數

由於你n/2^k取整後》=1

即令n/2^k=1

可得k=log2n,(是以2為底,n的對數)

所以時間複雜度可以表示o()=o(logn)

順序查詢 二分查詢

順序查詢 適用範圍 沒有進行排序的資料序列 缺點 速度非常慢,效率為o n cpp view plain copy 在code上檢視 片派生到我的 片 實現 template type sequencesearch type begin,type end,const type searchvalue...

順序查詢與二分查詢

先上 include void printarr int a,int n void bublesort int a,int n void swap int a,int b int binarysearch int a,int n,int k int normalsearch int a,int n,...

順序查詢和二分查詢

二分查詢 陣列裡查詢某個元素 search函式 其中 array為陣列,k為要找的值,low為查詢範圍的最小鍵值,high為查詢範圍的最大鍵值 function search array,k,low 0,high 0 if low high 如果還存在剩餘的陣列元素 elseif k array m...