演算法筆記05 查詢 跳表 雜湊表

2021-10-06 06:39:50 字數 2171 閱讀 3030

二分查詢針對的是乙個有序的資料集合,查詢思想有點類似分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0。

二分查詢是一種非常高效的查詢演算法,時間複雜度是 o(logn)。o(logn) 這種對數時間複雜度,是一種極其高效的時間複雜度,有的時候甚至比時間複雜度是常量級o(1) 的演算法還要高效。二分查詢更適合處理靜態資料,也就是沒有頻繁的資料插入、刪除操作。

使用迴圈和遞迴都可以實現二分查詢。

二分查詢應用場景的侷限性:

四種常見的二分查詢變形問題

1.查詢第乙個值等於給定值的元素

2.查詢最後乙個值等於給定值的元素

3.查詢第乙個大於等於給定值的元素

4.查詢最後乙個小於等於給定值的元素

適用性分析

1.凡事能用二分查詢解決的,絕大部分我們更傾向於用雜湊表或者二叉查詢樹,即便二分查詢在記憶體上更節省,但是畢竟記憶體如此緊缺的情況並不多。

2.求「值等於給定值」的二分查詢確實不怎麼用到,二分查詢更適合用在」近似「查詢問題上。比如上面講幾種變體。

跳表是一種動態資料結構,可以支援快速的插入、刪除、查詢操作,寫起來也不複雜,甚至可以替代紅黑樹(red-black tree)。redis 中的有序集合(sorted set)就是用跳表來實現的。

鍊錶加多級索引的結構,就是跳表。

在乙個單鏈表中查詢某個資料的時間複雜度是 o(n)。那在乙個具有多級索引的跳表中查詢任意資料的時間複雜度是 o(logn)。這個查詢的時間複雜度跟二分查詢是一樣的。換句話說,我們其實是基於單鏈表實現了二分查詢。(這種查詢效率的提公升,前提是建立了很多級索引,也就是空間換時間的設計思路。)

跳表的空間複雜度是o(n)。也就是說,如果將包含 n 個結點的單鏈表構造成跳表,我們需要額外再用接近 n 個結點的儲存空間。

在實際的軟體開發中,原始鍊錶中儲存的有可能是很大的物件,而索引結點只需要儲存關鍵值和幾個指標,並不需要儲存物件,所以當物件比索引結點大很多時,那索引占用的額外空間就可以忽略了。

跳表這個動態資料結構,不僅支援查詢操作,還支援動態的插入、刪除操作,而且插入、刪除操作的時間複雜度也是 o(logn)。

作為一種動態資料結構,我們需要某種手段來維護索引與原始鍊錶大小之間的平衡,也就是說,如果鍊錶中結點多了,索引結點就相應地增加一些,避免複雜度退化,以及查詢、插入、刪除操作效能下降。

跳表是通過隨機函式來維護「平衡性」,當我們往跳表中插入資料的時候,我們可以選擇同時將這個資料插入到部分索引層中。

為什麼 redis 要用跳表來實現有序集合,而不是紅黑樹?

redis 中的有序集合支援的核心操作主要有下面這幾個:

對於按照區間查詢資料這個操作,跳表可以做到 o(logn) 的時間複雜度定位區間的起點,然後在原始鍊錶中順序往後遍歷就可以了。這樣做非常高效。

雜湊錶用的是陣列支援按照下標隨機訪問資料的特性,所以雜湊表其實就是陣列的一種擴充套件,由陣列演化而來。可以說,如果沒有陣列,就沒有雜湊表。

雜湊函式,可以把它定義成hash(key),其中 key 表示元素的鍵值,hash(key) 的值表示經過雜湊函式計算得到的雜湊值。

雜湊函式設計的基本要求:

1. 雜湊函式計算得到的雜湊值是乙個非負整數;

2. 如果 key1 = key2,那 hash(key1) == hash(key2);

3. 如果 key1 ≠ key2,那 hash(key1) ≠ hash(key2)。

雜湊衝突

再好的雜湊函式也無法避免雜湊衝突。常用的雜湊衝突解決方法有兩類,開放定址法(open addressing)和鍊錶法(chaining)。

開放定址法的核心思想是,如果出現了雜湊衝突,我們就重新探測乙個空閒位置,將其插入。三種探測方法是:線性探測(linear probing)、二次探測(quadratic probing)、雙重雜湊(double hashing)。

查詢演算法 雜湊演算法,雜湊表查詢

那麼問題來了,如果集合s中同時存在值k 16和值k 27,我們該如何將兩個位址一樣的值存入雜湊表呢?常用的雜湊函式 處理衝突的方法 2.連位址法 雜湊表涉及的是一種對映關係,可以根據某個值查詢到關鍵字的位址,這樣的做法省去了比較的時間,優化了演算法。雜湊表是把值 關鍵字 存到跟它具有 唯一 對映的格...

演算法筆記 跳表

這種鍊錶加多級索引的結構,就是跳表 每兩個結點會抽出乙個結點作為上一級索引的結點,那第一級索引的結點個數大約就是 n 2,第二級索引的結點個數大約就是 n 4,第 索引的結點個數大約就是 n 8,依次類推,也就是說,第 k 級索引的結點個數是第 k 1 級索引的結點個數的 1 2,那第 k級索引結點...

演算法 查詢 雜湊表查詢

查詢除了線性表的查詢 順序 二分 分塊 樹上查詢 bst b 樹 還有一種雜湊查詢。相比於前兩種查詢,雜湊表的查詢效率驚人的高o 1 它採用的直接定址技術,基本上就是實現了精準打擊,達到一擊而中的效果。所謂的直接定址技術,說白了,就是儲存記錄時,通過雜湊函式計算出乙個雜湊位址 讀取記錄時,通過同樣的...