從這篇部落格開始我會將在部落格裡分享我在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 輸...