模擬雜湊表(也稱雜湊表)過程分享

2021-10-02 14:21:39 字數 2241 閱讀 4813

從這篇部落格開始我會將在部落格裡分享我在acwing社群學習和刷題的過程,有任何問題希望能多多指正。

以下是acwing社群主頁

acwing社群主頁

hash,一般翻譯做雜湊、雜湊,或音譯為雜湊,是把任意長度的輸入(又叫做預對映pre-image)通過雜湊演算法變換成固定長度的輸出,該輸出就是雜湊值。

雜湊即是把乙個比較複雜的資料結構對映到0-n的數軸上

但由於總體值域很大,而對映的目標的範圍小,所以一定會產生"衝突"

衝突即是有不同的數對映到了同乙個元素上,這樣的話就需要通過方式以解決衝突問題

處理衝突的方法一般為兩種:拉鍊法與開放定址法

開乙個雜湊陣列儲存所有雜湊值。當把某乙個數對映到雜湊表上的某乙個值時,在相應的陣列(我開的h[ ]陣列)下拉一條鏈用來儲存當前槽上已有的數(未雜湊之前的原數)

tips1:雜湊演算法是一種期望演算法,一般情況下每一條鏈的長度可看成常數。所以一般情況下雜湊表的時間複雜度都很好,為o(1)。

tips2:在取區間的長度時,區間的長度最好是乙個質數,這樣的話衝突的平均概率是最小的。這個結論可以通過數學證明出來(自己可以去要查一下)。

bool

find

(int x)

簡單提一下陣列模擬單鏈表:
兩個陣列乙個變數:int e[n]

,ne[n]

,idx;

e陣列存放值,ne陣列存放各節點的下乙個節點的位置,idx是當前處理到了哪個

void

insert

(int x)

//insert模擬插入操作

只開乙個陣列,但是這個陣列的長度要開到題目所給資料範圍的兩倍到三倍 存放所有的數

處理衝突的方法是通過乙個find函式實現的,具體為:

find函式:返回值有兩種情況:

第一種是在插入過程中,返回的int值代表find函式已經找到了乙個可以放數x的空位,通知主函式把數放到返回值對應的位置上去

跳出while迴圈的判斷條件是當前位置為空值

第二種是在查詢過程中,返回的int值代表已經在k位置上找到了x,如果沒有找到的話此返回位置對應的地方是null,依次判斷yes or no

跳出while迴圈的判斷條件是當前位置k上的值==x;如果沒有找到x,則會因為該位置上是null而退出

intfind

(int x)

return k;

}

拉鍊法

#include

#include

#include

using

namespace std;

const

int n=

100003

;int h[n]

;int e[n]

,ne[n]

,idx;

//為鍊錶開的東西 陣列模擬鍊錶

void

insert

(int x)

bool

find

(int x)

intmain()

}return0;

}

開放定址法

#include

#include

#include

#include

using

namespace std;

const

int n=

100003

, null=

0x3f3f3f3f

;//null定義為乙個無窮大的量,之所以是四個3f是因為memset使以直接方式初始化的,而int佔四個位元組

int h[n]

;//h陣列中存放的都是元素雜湊之前的原始真實值,雜湊的意義是為數雜湊出乙個陣列中的位置

intfind

(int x)

return k;

}int

main()

}return0;

}

模擬雜湊表(也稱雜湊表)過程分享

模擬雜湊表過程分享 從這篇部落格開始我會將在部落格裡分享我在acwing社群學習和刷題的過程,有任何問題希望能多多指正。以下是acwing社群主頁 acwing社群主頁 hash,一般翻譯做雜湊 雜湊,或音譯為雜湊,是把任意長度的輸入 又叫做預對映pre image 通過雜湊演算法變換成固定長度的輸...

模擬雜湊表 雜湊

維護乙個集合,支援如下幾種操作 i x 插入乙個數x q x 詢問數x是否在集合 現過 現在要進行n次操作,對於每個詢問操作輸出對應的結果。輸入格式 第一行包含整數n,表示運算元量。接下來n行,每行包含乙個操作指令,操作指令為 i x q x 中的一種。輸出格式 對於每個詢問指令 q x 輸出乙個詢...

AcWing 模擬雜湊表 雜湊表 模擬

時 空限制 1s 64mb 維護乙個集合,支援如下幾種操作 i x 插入乙個數x q x 詢問數x是否在集合 現過 現在要進行n次操作,對於每個詢問操作輸出對應的結果。第一行包含整數n,表示運算元量。接下來n行,每行包含乙個操作指令,操作指令為 i x q x 中的一種。對於每個詢問指令 q x 輸...