之前我們提到了雜湊集合的樸素實現。
你要知道雜湊表的乙個重要思想就是使用空間換時間。
他引入了乙個用作桶的陣列。所以我們可以通過o(1)的時間+雜湊函式進行插入和檢索。
不過這種做法空間的浪費太嚴重了,注意到我們c++中使用hash來實現的set,是不能儲存重複元素的。
在這種背景下,我們使用乙個int的空間只是為了儲存0和1兩個陣列。
如果我們遇到大資料的情況,空間浪費就不容忽視了。
對於0和1兩個數字我們完全可以用1個位來儲存,這就是我們的bitmap思想。
乙個int型別的元素,最多能儲存32位的資訊。這32位都可以用來儲存我們的key。
不過這裡32位最多也只能儲存32個key。為此我們引入了陣列。
乙個擁有m個元素的陣列,最多可以儲存m * 32個元素的key。
我們可以通過以下兩個部分來訪問這個元素的鍵:
確定這個鍵在那個範圍:a[val / 32]確定這個鍵在那個位上:1 << (val % 32)
這樣一來就和我們的樸素實現差不多了 。
class myhashset
void add(int key)
void remove(int key)
/** returns true if this set contains the specified element */
bool contains(int key)
};/**
* your myhashset object will be instantiated and called as such:
* myhashset* obj = new myhashset();
* obj->add(key);
* obj->remove(key);
* bool param_3 = obj->contains(key);
*/
這個基於bitmap的hashset實現還有純位操作版本的,它使用了以下技巧:
與除法等價的位操作——右移操作。
與取餘等價的位操作——使用mask來獲取數字的後面幾位。
雜湊表 雜湊集合(樸素實現)
在實際程式設計中,我們常常面臨著兩個問題 儲存和查詢,這兩個過程的效率往往制約著整個程式的效率,而我們常見的儲存資料的資料結構比如線性表,樹,圖等,資料在結構中的位置往往是不明確的,當我們在這些資料結構中要查詢乙個資料,都避免不了去執行查詢演算法,去遍歷資料結構,拿關鍵字和結構中的資料進行一一比較,...
雜湊表 雜湊表
一 定義 雜湊表 hash table,也叫雜湊表 是根據關鍵碼值 key value 而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中乙個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做雜湊表。雜湊表的做法其實很簡單,就是把key通過乙個固定的演算法函式...
雜湊表(雜湊表)
雜湊表是最基礎的資料結構之一,利用鍵值對儲存並檢索資料的一種非線性結構。在其它各種結構線性表 樹等資料結構中,記錄在結構中的位置是隨機的,和記錄關鍵字之間不存在確定的關係,因此,在結構中查詢記錄時需進行一系列和關鍵字的 比較 的基礎上。在順序查詢時,比較的結果為 與 兩種可能 在折半查詢 二叉排序樹...