哈哈,這是我第一篇博客園的博客。嘗試了一下用python實現的哈希表,首先處理沖突的方法是開放地址法,沖突表達式為Hi=(H(key)+1)mod m,m為表長。
1 #! /usr/bin/env python 2 #coding=utf-8 3 #實現哈希表(線性地址再散列) 4 5 def ChangeKey(key, m, di): 6 key01 = (key+di) % m 7 return key01 8 9 a = raw_input("Please entry the numbers:\n").split() 10 m = len(a) 11 dict01 = {} 12 for i in a: 13 key = int(i) % m 14 if "%s" % key in dict01: 15 NewKey = ChangeKey(key, m, 1) 16 while "%s" % NewKey in dict01: #因為下面的dict01的key值是以字符串來保存,因此這里作判斷時也要用字符串格式 17 NewKey = ChangeKey(NewKey, m, 1) 18 dict01["%s" % NewKey] = int(i) 19 else: 20 dict01["%s" % key] = int(i) 21 print dict01
接下來是用開放地址法。
目標,輸入:key/value列表,輸出:運用拉鏈法的哈希表
對於下面的這個函數,輸入的是一個這樣的列表數據結構:["key01 val01", "key02 val01", "key03 val01", "key01 val02", "key02 val02", "key01 val03", ...]
而函數返回一個這樣的字典數據結構:{key01:[val01, val02, val03, ...],key02:[val01, val02...], key03:[val01, ...]}。這個函數和MapReduce思想中的Reduce功能是類似的。
代碼如下:
def chainHash(InputList): res = {} for line in InputList: if line.split()[0] not in res: temp = [] #因為在拉鏈法中,鍵值包含多個對象,因此需要新建一個列表,把鍵值保存在這個列表中 temp.append(line.split()[1]) res["%s" % line.split()[0]] = temp else: res["%s" % line.split()[0]].append(line.split()[1]) return res