學習筆記 雜湊表

2022-05-21 11:57:14 字數 2200 閱讀 9601

最近開始把之前欠的noip基礎知識點刷一下

2333其實我的作業還沒有寫完

做到雜湊表的時候,我有點懵,顯然前幾次講課的時候我沒有聽

於是lbmttw_lx就開始在網上學習了

(啊啊啊 沙雕橘貓真心可愛,愛了愛了)

發現其實hash表是個比較有趣的東西

(一種典型的空間換時間的資料結構,也叫雜湊表)

時間複雜度o(1)查詢

雜湊表之所以能過做到o(1)查詢,是因為它的查詢是直接按照關鍵字key value來的

也就是說,它將關鍵字通過某種規則對映到陣列中的某個位置,以加快查詢的速度。

雜湊表中的每乙個元素,都應該有且只有乙個位址。

如果兩個元素都擁有乙個位址,就產生了雜湊衝突,發生衝突的不同關鍵字被稱之為同義詞。

處理雜湊衝突有很多方法,但是都是基於處理關鍵字而來的,盡可能讓關鍵字都不相同。

那麼,關鍵字是如何來的呢?其實就是雜湊函式處理得到的。

首先是雜湊函式h,h就是賦予特定元素特定的位址的函式,雜湊表則是基於雜湊函式而建立起來的查詢表

那麼問題來了,既然雜湊函式這麼好,我們如何構造它呢??

有好幾種構造雜湊函式的方法,分別是

1.直接定址法

2.數學分析法

3.平方取中法

4.摺疊法

5.除留餘數法

由於第一種 和第五種方法可能用到的比較廣泛,主要說一下這兩種吧

我是不會告訴你們剩下幾種我也不會的!

1.直接定址法

取元素的關鍵字或關鍵字的線性函式值為雜湊位址

如h(x)=x或h(x)=a*x+b(a,b都為常數)

2.除留餘數法

取關鍵字被某個不大於雜湊表長度 m 的數 p 求餘,得到的作為雜湊位址。

即 h(key) = key % p, p < m。 

還有很多構造雜湊函式的方法,無論是什麼方法,原則都應該是

盡可能避免或減少雜湊衝突

23333上那道模板題

給定兩個集合a、b,集合內的任一元素x滿足1 ≤ x ≤ 10^9,並且每個集合的元素個數不大於10000 個。我們希望求出a、b之間的關係。只需確定在b 中但是不在 a 中的元素的個數即可。

第一行兩個數m和n分別表示集合a和集合b元素的個數。 以下兩個分別是集合a和集合b的元素。

乙個數,表示在b中但是不在 a 中的元素的個數。

5 6

1 3 8 4 9

4 8 9 10 12 13

3
時間限制:1s

空間限制:128mb

是不是看完部落格介紹之後覺得這道題很簡單了呢??

1 #include 2

#define mo 100005

3#define maxn 2000000

4using

namespace

std;

5int

m,n,a[maxn],b,ans,ha[maxn],now[maxn];

6bool hash(inti)7

12bool judge(int

x)1323}

24return

ju;25}26

intmain()

2734

for(int i=1;i<=n;i++)

3540 cout

41return0;

42 }

view code

雜湊表的學習筆記

昨天晚上,被一道leetcode上名叫palindrome pairs困擾了很久,導致沒時間寫點什麼。堅持,不管學的多少,爭取每天進步一點,記錄一點。今天用到了c stl的map容器,了解到map容器內部儲存是用紅黑樹,可以使查詢訪問map中元素的時間從線性結構的o n 減少到o logn 關於紅黑...

雜湊表與雜湊演算法學習筆記

雜湊表 於陣列具有下標隨機訪問特性,理解這點非常重要。可以說雜湊表是由陣列進化來的。將輸入的鍵通過雜湊函式對映得出的value作為index去table中查詢,這便是雜湊的思想。graph lr a 鍵值key 雜湊函式 b 結果value 我們了解到為什麼雜湊表的查詢複雜度是o 1 因為key v...

學習雜湊表

雜貨店商品對應的 舉例 簡單查詢就是拿出商品價目本,這個價目本並不是有序的,顧客問蘋果多少錢,需要乙個乙個去查詢某乙個商品的 需要o n 時間。同樣是乙個價目本,但是按商品名稱字母排序的,這樣需要的時候更短為o logn 但這樣我還是覺得查詢太慢,怎麼辦,這時候需要一名能記住所有商品 的員工,這樣一...