三種查詢演算法:順序查詢,二分法查詢(折半查詢),分塊查詢,雜湊表(以後談)
一、順序查詢的基本思想:
從表的一端開始,順序掃瞄表,依次將掃瞄到的結點關鍵字和給定值(假定為
a)相比較,若當前結點關鍵字與
a相等,則查詢成功;若掃瞄結束後,仍未找到關鍵字等於
a的結點,則查詢失敗。
說白了就是,從頭到尾,乙個乙個地比,找著相同的就成功,找不到就失敗。很明顯的缺點就是查詢效率低。
適用於線性表的順序儲存結構和鏈式儲存結構。
計算平均查詢長度。
例如上表,查詢
1,需要
1次,查詢2需要
2次,依次往下推,可知查詢
16需要
16次,
可以看出,我們只要將這些查詢次數求和(我們初中學的,上底加下底乘以高除以
2),然後除以結點數,即為平均查詢長度。 設
n=節點數
平均查詢長度=(
n+1)/2
二、二分法查詢(折半查詢)的基本思想:
前提:(
1)確定該區間的中點位置:
mid=
(low+high
)/2
min代表區間中間的結點的位置,
low代表區間最左結點位置,
high
代表區間最右結點位置 (
2)將待查
a值與結點
mid的關鍵字(下面用
r[mid].key
)比較,若相等,則查詢成功,否則確定新的查詢區間: 如果
r[mid].key>a
,則由表的有序性可知,
r[mid].key
右側的值都大於
a,所以等於
a的關鍵字如果存在,必然在
r[mid].key
左邊的表中。這時
high=mid-1 如果
r[mid].key則等於
a的關鍵字如果存在,必然在
r[mid].key
右邊的表中。這時
low=mid 如果
r[mid].key=a
,則查詢成功。 (
3)下一次查詢針對新的查詢區間,重複步驟(
1)和(2)
(4)在查詢過程中,
low逐步增加,
high
逐步減少,如果
high,則查詢失敗。
平均查詢長度
=log2
(n+1)-1
注:雖然二分法查詢的效率高,但是要將表按關鍵字排序。而排序本身是一種很費時的運算,所以二分法比較適用於順序儲存結構。為保持表的有序性,在順序結構中插入和刪除都必須移動大量的結點。因此,二分查詢特別適用於那種一經建立就很少改動而又經常需要查詢的線性表。
三、分塊查詢的基本思想:
二分查詢表使分塊有序的線性表和索引表(抽取各塊中的最大關鍵字及其起始位置構成索引表
)組成,由於表是分塊有序的,所以索引表是乙個遞增有序表,因此採用順序或二分查詢索引表,以確定待查結點在哪一塊,由於塊內無序,只能用順序查詢。
設表共n個結點,分b塊,
s=n/b (
分塊查詢索引表
)平均查詢長度
=log2
(n/s+1
)+s/2 (
順序查詢索引表
)平均查詢長度
=(s2
+2s+n)/(2s)
注:分塊查詢的優點是在表中插入或刪除乙個記錄時,只要找到該記錄所屬塊,就在該塊中進行插入或刪除運算(因塊內無序,所以不需要大量移動記錄)。它主要代價是增加乙個輔助陣列的儲存控制項和將初始表分塊排序的運算。
它的效能介於順序查詢和二分查詢之間。
四、最近比較忙,後續找個時間還會談談雜湊表(雜湊表)技術,希望大家關注!
雜湊表查詢技術不同於順序查詢、二分查詢、分塊查詢。它不以關鍵字的比較為基本操作,採用直接定址技術。在理想情況下,無須任何比較就可以找到待查關鍵字,查詢的期望時間為o(1)。
前兩篇
《程式設計師必知8大排序3大查詢(一)》
《程式設計師必知8大排序3大查詢(二)》
感謝大家的支援,無論是頂的,還是踩的,都謝謝你們,希望大家互相關注,共同進步。
程式設計師必知8大排序3大查詢
每天都在叫囂自己會什麼技術,什麼框架,可否意識到你每天都在被這些新名詞 新技術所迷惑,net xml等等技術固然誘人,可是如果自己的基礎不紮實,就像是在雲裡霧裡行走一樣,只能看到眼前,不能看到更遠的地方。這些新鮮的技術掩蓋了許多底層的原理,要想真正的學習技術還是走下雲端,扎扎實實的把基礎知識學好,有...
程式設計師必知8大排序3大查詢(一)
每天都在叫囂自己會什麼技術,什麼框架,可否意識到你每天都在被這些新名詞 新技術所迷惑,net xml等等技術固然誘人,可是如果自己的基礎不紮實,就像是在雲裡霧裡行走一樣,只能看到眼前,不能看到更遠的地方。這些新鮮的技術掩蓋了許多底層的原理,要想真正的學習技術還是走下雲端,扎扎實實的把基礎知識學好,有...
程式設計師必知8大排序3大查詢(二)
程式設計師必知 8大排序 3大查詢 一 程式設計師必知8大排序3大查詢 三 本文我們先把剩餘的三大排序說完,然後討論一下排序的穩定性問題,最後再總結一下排序的時間複雜度和空間複雜度。1 到5見上篇 6 快速排序 1 基本思想 選擇乙個基準元素 通常選擇第乙個元素或者最後乙個元素 通過一趟掃瞄,將待排...