LintCode 簡單 128 雜湊函式

2021-10-09 02:40:28 字數 1669 閱讀 6175

1.問題描述:

在資料結構中,雜湊函式是用來將乙個字串(或任何其他型別)轉化為小於雜湊表大小且大於等於零的整數。乙個好的雜湊函式可以盡可能少地產生衝突。一種廣泛使用的雜湊函式演算法是使用數值33,假設任何字串都是基於33的乙個大整數,比如:

hashcode("abcd") = (ascii(a) * 333 + ascii(b) * 332 + ascii(c) *33 + ascii(d)) % hash_size 

= (97* 333 + 98 * 332 + 99 * 33 +100) % hash_size

= 3595978 % hash_size

其中hash_size表示雜湊表的大小(可以假設乙個雜湊表就是乙個索引0 ~ hash_size-1的陣列)。

給出乙個字串作為key和乙個雜湊表的大小,返回這個字串的雜湊值。

2.樣例:

樣例 1:

輸入:  key = "abcd", size = 1000

輸出: 978    

樣例解釋:(97 * 33^3 + 98*33^2 + 99*33 + 100*1)%1000 = 978

樣例 2:

輸入:  key = "abcd", size = 100

輸出: 78    

樣例解釋:(97 * 33^3 + 98*33^2 + 99*33 + 100*1)%100 = 78

3.**:

class solution:

"""@param key: a string you should hash

@param hash_size: an integer

@return: an integer

"""def hashcode(self, key, hash_size):

# write your code here

# method 1

# length = len(key)

# sum = 0

# for i in range(len(key)):

# sum += ord(key[i]) * pow(33,length-i-1)

# print(sum)

# return sum % hash_size

# method 2

value = 0

for i in key:

value = (ord(i) + value * 33) % hash_size

return value

本題直接使用method1會出現超時錯誤,需要使用更加巧妙的方法。這裡引出乙個定理:同餘定理。記住以下三大定理:

1 (a + b) % c = (a % c + b % c) % c

2 (a * b) % c = (a % c * b % c) % c

3 mk % m = 0, b % m = 0, (mk + b) % m = 0

這裡對於這種都乘乙個數的次方時,可以根據下面的式子進行化簡:

a * 33 ^ 4 + b * 33 ^ 3 + c * 33 ^ 2 + d * 33 ^ 1 + e

=(((a * 33 + b) * 33 + c) * 33 + d) * 33 + e

lintcode 128 雜湊函式

hashcode abcd ascii a 333 ascii b 332 ascii c 33 ascii d hash size 97 33 3 98 33 2 99 33 100 hash size 3595978 hash size 其中hash size表示雜湊表的大小 可以假設乙個雜湊表...

lintcode 128 雜湊函式

97 333 98 332 99 33 100 hash size 3595978 hash size其中hash size表示雜湊表的大小 可以假設乙個雜湊表就是乙個索引0 hash size 1的陣列 給出乙個字串作為key和乙個雜湊表的大小,返回這個字串的雜湊值。樣例 樣例 1 輸入 key ...

LeetCode 128 最長連續序列 雜湊表法

這裡是題目描述 leetcode 最長連續序列 如果題幹中不對時間複雜度做o n 的限制的話,這道題沒有什麼難度,我們可以對陣列排序後使用雙指標 或者基於貪心演算法 來解本題,時間複雜度為o nlogn 但是加上時間複雜度不超過o n 這一限制後,我們不能再採用先排序再貪心的方法,因為大多數排序演算...