最近開始把之前欠的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 2view code#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 }
雜湊表的學習筆記
昨天晚上,被一道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 但這樣我還是覺得查詢太慢,怎麼辦,這時候需要一名能記住所有商品 的員工,這樣一...