2015-12-07 120 views
0

我很難理解Learn Python The Hard Way Ex39中的很多代碼。學習Python困難的方式Ex39,很難理解它的代碼

我的第一個混淆是關於作者爲什麼在這裏使用模塊劃分hash(key) % len(aMap)。它返回什麼價值?爲什麼作者需要提醒?

def hash_key(aMap, key): 
    """Given a key this will create a number and then convert it to an index for the aMap's buckets.""" 
    return hash(key) % len(aMap) 

第二個令人困惑的事情對我來說是下一個代碼

def get_bucket(aMap, key): 
    """Given a key, find the bucket where it would go.""" 
    bucket_id = hash_key(aMap, key) 
    return aMap[bucket_id] 

在我的理解,bucket_id應該等於hash(key) % len(aMap)價值,爲什麼我們不返回aMap[hash(key)]

+0

也許使用桶理解[哈希](https://en.wikipedia.org/wiki/Hash_table)的想法可能是有用的 – pazitos10

回答

0

Modulo用於限制數字範圍。這是一個衆所周知的技巧。這樣,如果你溢出你「發送」數字回到範圍。

假設我想要[0,9)中的數字,並且我有一個哈希生成器,而不是生成[0,100]範圍內的數字。如果我使用hash % 10它保證在我預期的範圍內。在第一段代碼中,這個技巧用於將一個項目與一個存儲桶進行匹配,因爲散列不一定是有限的,而是存儲桶。

第二段代碼只是使用受限散列(在存儲區範圍內)獲取存儲區。爲了理解它,你必須明白,大部分時間哈希映射都適用於桶。 A 哈希映射分佈在桶中的項目平均(或接近它)。因此,如果我們重新迭代 - 如果散列值在[0,100]和10個存儲區[0,10]範圍內,則每個項目的存儲區索引可以用hash % 10來計算。這會將每個項目的散列值與想要的範圍[0,10)中的一個桶匹配。

相關問題