雜湊(hash 雜湊表)

2021-08-22 08:53:50 字數 2482 閱讀 2571

可以認為雜湊有著陣列的思想,它將所有的資料段拼成乙個陣列(順序表)進行儲存,通過雜湊函式,可以基本上以o(1)的時間複雜度來查詢和儲存資料。

通過資料段中的唯一關鍵字(key),經過某種演算法,得出此資料段在整個雜湊陣列(順序表)中的的下標,然後直接取元素即可。

有資料結構如下:

//資料段(key,value)

typedef struct data

data;

//雜湊表

//可以動態的從堆中申請連續的空間,將首位址賦給table之後table就可以按照陣列的方式來使用了

typedef struct hash

有一系列key資料:

因為資料段中的key不一定從零開始,並且不一定連續,所以我們需要雜湊函式來計算下標

那麼函式就可以定義如下:

int hashfunc(int key, int capacity)

此時,乙個簡單的雜湊表就完成了。

但是,好像有問題,因為會出現兩個不一樣的key經過雜湊函式最後得出來的下標有可能相同,此時,就需要進行衝突解決了。

當乙個key計算出的的下標和之前乙個key計算出來的下標相同,那麼就從此下標挨個向後找,碰到第乙個空的就將資料存進去

所以最後雜湊陣列的儲存情況為:

這裡的12和24計算的下標都是0,所以按照線性探測規則,將24存在了1下標處

雜湊表的插入

首先雜湊表是空的,所以我們只需要按照雜湊函式的方法以及解決衝突的方法插入即可。

雜湊表的查詢可以和插入是相同的,按照雜湊函式的方法和約定的衝突方法就可以很快找出想找的資料,但是如果找的時候向碰到了空,那麼說明此雜湊表中沒有此資料。

雜湊表的刪除是不能世界進行刪除的,為什麼呢?

我用上面的例子:

例如現在想刪除12這個key所對應的資料,如果直接刪除的話,那麼再次尋找24的資料就會先找到0號空間,那麼一找到空的空間,查詢的函式會判定此雜湊函式沒有此資料,但其實表中是存在的。

狀態假刪除
發生如上的情況的話話那就可以通過給每個空間設定乙個狀態,判斷是為沒資料但已刪除還是有資料沒刪除,這樣在刪除資料的時候將空間的狀態置成沒資料但已刪除,在給查詢的方法增加判斷狀態的機制,這樣就很容易解決這個問題。

我們這裡舉的例子是乙個陣列,所以不方便擴容,但在實際使用的時候,雜湊表是很容易需要擴容的。

擴容容量選擇:

如果下標值已經被占用,那就先給key值加上衝突次數的平方然後再進行取餘。

int hashfunc(int key,int capacity, int times)

優點:

雜湊表的每乙個下標不止放乙個資料段,即每個下標所對應的型別是乙個資料段的集合

此集合可以為陣列結構,樹形結構,鍊錶結構,或者雜湊結構,此集合就叫做雜湊桶(hashbuket)。

再次舉例一下鍊錶結構的資料結構:

//首先是資料段,和上面定義的資料段是一樣的

//然後是乙個鍊錶

typedef struct slist

slist;

//雜湊表

typedef struct hash

結構圖:

注:隊中的元素全都是slist結構體,table是乙個有頭的鍊錶。

查詢的時候先用雜湊函式計算出下標,決定進入那個鍊錶,然後再進行遍歷鍊錶。

這樣的方法會頻繁的出現資料擁堵的現象,因為查詢的時候是編譯,這樣會降低效率,所以如果使用樹形結構,或者雜湊結構,這樣查詢的效率是非常高的。

雜湊的key不只可以為整型,其實還可以是其他型別的資料,只要是做出合理的雜湊函式即可

如果別人知道了雜湊函式的演算法,那麼資料將會不安全,因為一般使用者操作的是key值,並且只能根據所給的選項正常的修改資料,如果一些人知道了雜湊演算法,那麼他們就可以通過此演算法找到實際的資料,然後任意的修改,這樣是不安全的,所以再寫雜湊的演算法的時候可以哦那個過使用加上一些隨機的因子來保證資料的安全

Hash表(雜湊表 雜湊表)

雜湊函式 乙個把查詢表中的關鍵字對映成該關鍵字對應的位址的函式,記為hash key addr。位址可以是陣列下標,索引,或記憶體位址等 衝突 雜湊函式可能會把兩個和兩個以上的不同關鍵字對映到同一位址。衝突不可避免,所以要設計好的處理衝突的方法。同義詞 發生碰撞的不同關鍵字為同義詞。雜湊表 根據關鍵...

Hash和雜湊 雜湊 表

hash又稱為雜湊,是把任意長度的輸入 又叫做預對映pre image 通過雜湊演算法變成固定長度的輸出,該輸出就是雜湊值。hash演算法還有乙個特點,就是很難找到逆向規律。在同一函式下,如果兩個雜湊值是不相同的,那麼這兩個雜湊值的原始輸入也是不同的。hash演算法又被稱為雜湊演算法。雖然被稱為演算...

Hash 雜湊 雜湊

hash 一種用於查詢的資料結構 雜湊查詢的前提是已經一定的規則方法建好了雜湊表。基本思想是 關鍵字 位址轉換法 以資料物件的關鍵字為自變數,通過乙個確定的函式關係h,計算出對應的函式值h key 把這個值解釋為資料物件的儲存位址,並按此存放,即儲存位置 h key 關鍵 1.構造好的雜湊函式 2....