目录
哈希表
以关键字为自变量,通过一定的函数关系,计算出对应的函数值(哈希值)
哈希函数是一个映象,将关键字的集合映射到某个地址集合上。
对数字的关键字的构造方法
1.直接定址法
2.数字分析法
3.平方取中法
4.折叠法
5.除留余数法
6.随机数法
(如果非数字关键字,则需先对其进行数字化处理)
直接定址法
哈希函数为关键字的线性函数
H(key)=key 或者 H(key) = a key + b
除留余数法
最为常见的方法之一。对于表长为m的数据集合,散列公式为:
f(key) = key mod p (p<=m)
该方法最关键的是对于p的选择,当数据量较大,冲突产生,一般选择近m的质数。
随机数法
选择一个随机数,取关键字的随机函数值为它的散列地址。
f(key)=random(key)
最后实例:
class HashTable:
def init(self, size):
self.elem = [None for i in range(size)] #使用list保存哈希表
self.count = size #最大表长
def hash(self, key):
return key % self.count #散列函数采用除留余数法
def insert_hash(self, key):
address = self.hash(key) #求散列地址
while self.elem[address]: #当前位置已经有数据了,发生冲突。
address = (address+1) % self.count #线性探测下一地址是否可用
self.elem[address] = key #没有冲突则直接保存。
def search_hash(self, key):
star = address = self.hash(key)
while self.elem[address] != key:
address = (address + 1) % self.count
if not self.elem[address] or address == star: #说明没找到或者循环开始
return False
return True
if name == '__main__':
list_a = [12, 67, 56, 16, 25, 37, 22, 29, 15, 47, 48, 34]
print(list_a)
hash_table = HashTable(12) #表长为12
for i in list_a:
hash_table.insert_hash(i)
print("构造哈希表")
for i in hash_table.elem:
if i:
print((i, hash_table.elem.index(i)), end=" ")
print("\n")
print("查找15结果是:",hash_table.search_hash(15))
print("查找33结果是:",hash_table.search_hash(33))