雜湊定義和整數雜湊 《演算法筆記》學習筆記

2021-08-30 13:40:59 字數 1324 閱讀 5765

本文內容完全參考胡凡的《演算法筆記》,目的自己學習一邊再記一下,方便本人日後複習;也本著分享的初衷給如我一樣的小白參考參考,在這裡推薦胡凡大佬的《演算法筆記》,令我受益匪淺。

問題:給出n個正整數,再給出m個正整數,問這m個數中每個數分別是否再n個數中出現過,其中n,m

最直接的思路是:對每個欲查詢的正整數x,遍歷所有n個數,看是否有乙個數與x相等。這個做法的時間複雜度為0(nm),當n和m很大時,這個方法肯定不行了。

有乙個新思路——用空間換時間,設定乙個bool型陣列hashtable[100010],其中hashtable[x]==true表示正整數x在n個正整數中出現過,而hashtable[x]==false表示正整數x在n個正整數中沒有出現過。這樣就可以在讀入n個正整數可以預處理,即當讀入數為x時,令hashtable[x]==true(說明:hashtable陣列需要初始化為false,表示初始狀態下所有數都未出現過)。於是對m個數欲查詢的數,就能直接通過hashtable陣列判斷每個數是否出現過。這種方法的時間複雜度o(n+m)。

#includeconst int maxn = 100010;

bool hashtable[maxn] = ;

int main()

for (int i = 0; i < m; i++)

else

} return 0;

}

如果題目要求m個欲查詢的數中每個數在n個數中出現的次數,那麼可以把hashtable陣列替換為int型,然後再輸入n個數時進行預處理,即當輸入數為x時,就令hashtable[x]++,這樣就可以用o(n+m)的時間複雜度輸出每個欲查詢的數出現的次數。

#includeconst int maxn = 100010;

int hashtable[maxn] = ;

int main()else if(s[i]>='a'&&s[i]<='a')

} return id;

}

如果出現數字,一般有兩種處理方法:

1、按照小寫字母的處理方法,增大進製數至62;

2、如果保證在字串的末尾確定個數的數字,那麼就可以把前面英文本母的部分按上面思路轉換成整數,再將末尾的數字直接拼接上去。例如對由三個字元加一位數字組成的字串「bcd4」來說,就可以先將前面的「bcd」轉換為整數731,然後直接拼接上末位的4變為7314.

int hashfunc(char s,int len)

return id;

}int main()

for(int =0;i

return 0;

}

雜湊的定義與整數雜湊

一般來說,雜湊可以濃縮成一句話 將元素通過乙個函式轉化為整數,使得該整數可以盡量唯一地代表這個元素。其中,把這個轉換函式稱為雜湊函式h,也就是說,如果該元素在轉換前為key,那麼轉換後就是乙個整數h key 常見的雜湊函式有直接位址法 平方取中法 除留餘數法等。其中,直接位址法是指恒等變換h key...

演算法筆記 HASH整數雜湊

雜湊 hash 這種演算法,就是為了避免遍歷整個陣列而計算輸入的整數出現的次數.這樣大大減少了複雜度.當讀入的數為x時,就令hashtable x true 說明 hashtable陣列需要初始化為false,表示初始狀態下所有數都未出現過.以下程式判斷數字x是否出現過 include includ...

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

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