符號表表示一張抽象的**,我們將資訊儲存到其中,然後按照指定的鍵來搜尋並獲取這些資訊。鍵和值的具體意義取決於不同的應用。符號表中可能會儲存很多鍵和很多資訊,因此實現一張高效的符號表也是一項很有挑戰性的任務。符號表也稱為字典。
符號表最主要的目的就是將乙個鍵和乙個值聯絡起來。用例能夠將乙個鍵值對插入符號表中,並希望在之後能夠從符號表的所有鍵值對中按照鍵直接找到相對應的值。
符號表是一種儲存鍵值的資料結構,支援兩種操作:插入( put ),即將一組新的鍵值對存入表中;查詢( get ),即根據給定的鍵得到相應的值。我們可以很容易想到使用鍊錶實現,每個結點儲存乙個鍵值對,get() 的實現即為遍歷鍊錶,如果匹配成功則返回相應的值,put() 的實現也是遍歷鍊錶,如果匹配成功則用第二個引數指定的值更新該鍵相關聯的值,否則就用給定的鍵值對建立乙個新的結點並將其插入到鍊錶。這種方法被稱為順序查詢。
**:
template
<
typename t,
typename u>
class
sequentialsearchst};
node* first =
nullptr
;public
:void
put(t key, u val)
first =
newnode
(key, val, first);}
u get
(t key)
};
在含有 n 對鍵值對的基於鍊錶中,未命中的查詢和插入操作都需要 n 次比較。命中的查詢在最壞情況下需要 n 次比較。向乙個空表中插入 n 個不同的鍵需要 n2/基於鍊錶的實現以及順序查詢是非常低效的。2n^2 / 2
n2/2
次比較
很多應用中,鍵都是可以比較的物件,因此很多符號表的實現都利用了鍵的有序性來更好的實現插入和查詢方法,並且可以高效的實現更多功能。
該實現的核心是 rank() 方法,它返回表中小於給定鍵的鍵的數量。
**:
#include
template
<
typename t,
typename u>
class
binarysearchst
return lo;
} u get
(t key)
void
put(t key, u val)
keys.
resize
(n +1)
; vals.
resize
(n +1)
;for
(int j = n; j > i; j--
) keys[i]
= key;
vals[i]
= val;
n++;}
};
使用有序陣列儲存鍵的原因是使用二分查詢能夠根據陣列的索引大大減少每次查詢所需的比較次數。
在 n 個鍵的有序陣列中進行二分查詢最多需要 lnn二分查詢減少了比較的次數,能夠保證查詢所需的時間是對數級別的,但是無法減少執行所需時間,因為 put() 方法太慢,構造乙個基於有序陣列的符號表所需要訪問陣列的次數是陣列長度的平方級別。+1
lnn+1
lnn+
1 次比較(無論是否成功)
向大小為 n 的有序陣列中插入乙個新的元素在最壞情況下需要訪問 2n 次數組,因此向乙個空符號表中插入 n 個元素在最壞的情況下需要訪問 n所以,以上兩種方法都不可行,下一節介紹二叉查詢樹。2n^2
n2次數組
《演算法》筆記 7 符號表 順序查詢 二分查詢
無序鍊錶中的順序查詢 有序陣列中的二分查詢 現代計算機和網路使人們能夠訪問海量的資訊,而且各種計算裝置正在源源不斷地生成新的資訊,高效檢索這些資訊的能力就成了處理它們的重要前提。接下來學習幾種經典的查詢演算法。符號表指的是一張用於儲存資訊的抽象的 主要目的就是將乙個鍵和乙個值聯絡起來,可以將乙個鍵值...
二分查詢實現符號表
使用keys和values兩個陣列分別儲存鍵和值 實現的核心是rank 方法,它返回表中小於給定鍵的數量 有序陣列的二分查詢 public class arraybinarysearchst comparable value implements iorderedsymboltable public...
順序查詢和二分查詢
二分查詢 陣列裡查詢某個元素 search函式 其中 array為陣列,k為要找的值,low為查詢範圍的最小鍵值,high為查詢範圍的最大鍵值 function search array,k,low 0,high 0 if low high 如果還存在剩餘的陣列元素 elseif k array m...