三種靜態查詢演算法 順序 二分 折半 索引 分塊查詢

2021-08-11 14:39:59 字數 2794 閱讀 8170

終於找了個時間,把三種靜態查詢演算法簡單總結了一下,與大家分享討論。

簡介順序查詢是在乙個已知無(或有序)序佇列中找出與給定關鍵字相同的數的具體位置。原理是讓關鍵字與佇列中的數逐個比較,直到找出與給定關鍵字相同的數為止。

**實現

public

static

intordersearch

(int arr,

int target)

效能分析

時間複雜度:o(n)

簡介二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。

因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。

兩個條件:1)序列有序;2)可以隨機訪問

查詢過程

首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

**實現

public

static

intbisearch

(int arr,

int target)

return-1

;}

效能分析

時間複雜度:o(log2(n))

因為二分查詢每次排除掉一半的不適合值,所以對於 n 個元素的情況:

一次二分剩下:n/2 

兩次二分剩下:n/2/2 = n/4

…….

m次二分剩下:n/(2^m)

在最壞情況下是在排除到只剩下最後乙個值之後得到結果,即

n/(2^m)=1

所以由上式可得 : 2^m = n

進而可求出時間複雜度為:m = log2(n)

簡介分塊查詢是折半查詢和順序查詢的一種改進方法,分塊查詢由於只要求索引表是有序的,對塊內節點沒有排序要求(塊內無序,塊間有序),因此特別適合於節點動態變化的情況。

折半查詢雖然具有很好的效能,但其前提條件時線性表順序儲存而且按照關鍵碼排序,這一前提條件在結點樹很大且表元素動態變化時是難以滿足的。而順序查詢可以解決表元素動態變化的要求,但查詢效率很低。如果既要保持對線性表的查詢具有較快的速度,又要能夠滿足表元素動態變化的要求,則可採用分塊查詢的方法。

當增加或減少節以及節點的關鍵碼改變時,只需將該節點調整到所在的塊即可。在空間複雜性上,分塊查詢的主要代價是增加了乙個輔助陣列。

方法描述

分塊查詢要求把乙個大的線性表分解成若干塊,每塊中的節點可以任意存放,但塊與塊之間必須排序。假設是按關鍵碼值非遞減的,那麼這種塊與塊之間必須滿足已排序要求,實際上就是對於任意的i,第i塊中的所有節點的關鍵碼值都必須小於第 i+1 塊中的所有節點的關鍵碼值。還要建立乙個索引表(索引表中為每一塊都設定索引項,每乙個索引項都包含兩個內容)

比如:

顯然,索引表是按關鍵字非遞減順序排列的。

一般先用二分查詢索引表,確定需要查詢的關鍵字在哪一塊,然後再在相應的塊內用順序查詢。

**實現

public

boolean

search

(int data)

}return

false;}

/** * 二分查詢

*/private

intbinarysearch

(int value)

else

}return start;

}

效能分析

這種帶索引表的分塊有序表查詢的時間效能取決於兩步查詢時間之和:如前面所述,第一步可以採用簡單順序查詢和折半查詢之一進行。第二步只能採用簡單順序查詢,但由於子表的長度較原表的長度小。因此,其時間效能介於順序查詢和折半查詢之間。

假設索引表有 n 個元素,每塊含有 s 個元素,平均查詢長度為:asl = (n / s + s) / 2 + 1,時間複雜度為 o(n)~o(log2n)

null

順序查詢

二分查詢

分塊查詢

表的結構

有序、無序

有序塊內無序、塊間有序

表的儲存

順序、鏈式

順序順序、鏈式

平均查詢長度

最大最小

中間時間複雜度

o(n)

o(log2n)

中間

------致所有正在努力奮鬥的程式猿們!加油!!有碼走遍天下 無碼寸步難行

1024 - 夢想,永不止步!

愛程式設計 不愛bug

愛加班 不愛黑眼圈

固執 但不偏執

瘋狂 但不瘋癲

生活裡的菜鳥

工作中的大神

身懷寶藏,一心憧憬星辰大海

追求極致,目標始於高山之巔

一群懷揣好奇,夢想改變世界的孩子

一群追日逐浪,正在改變世界的極客

你們用最美的語言,詮釋著科技的力量

你們用極速的創新,引領著時代的變遷

二分(折半)查詢演算法

二分查詢又稱折半查詢,它是一種效率較高的查詢方法。折半查詢的演算法思想是將數列按有序化 遞增或遞減 排列,查詢過程中採用跳躍式方式查詢,即先以有序數列的中點位置為比較物件,如果要找的元素值小於該中點元素,則將待查序列縮小為左半部分,否則為右半部分。通過一次比較,將查詢區間縮小一半。折半查詢是一種高效...

查詢演算法 二分(折半)查詢

基本思想 待查記錄的順序為從小到大 首先將待查元素的關鍵字 key 值與待查記錄中間位置上上 下標為mid 記錄的關鍵字進行比較,若相等,則查詢成功 若 key r mid key,則說明待查記錄只可能在後半部分 mid 1,n 1 中,下一步應在後半部分中查詢 若key timid key,說明待...

二分 折半 查詢

折半查詢 又叫二分查詢,採用分治思想,適用於不經常變動且查詢頻繁的表 演算法思想 將n個元素 假設n個元素公升序 分為大致相同的兩部分,取data n 2 與目標元素m比較 若data n 2 m return n 2 若data n 2 m 則我們只要在data的左半部分繼續查詢 若data n ...