数据结构:数据元素的集合 + 数据元素之间的关系
哈希表
通过哈希函数来计算数据存储位置:直接寻址表 + 哈希
1、哈希冲突
两个不同元素映射到同一个位置上
解决方法:
开放寻址法
拉链法
2、补充:直接寻址表
缺点:
当域很大时,需要消耗大量内存,很不实际
如果域很大而实际出现的key很少,则大量空间被浪费
无法处理关键字不是数字的情况
3、常见的哈希函数:
4、应用:md5、SHA2
5、代码部分:
class LinkList:
"""链表"""
class Node:
"""链表结点"""
def __init__(self, item):
self.item = item
self.next = None
class LinkListIterator:
def __init__(self, node):
self.node = node
def __next(self):
if self.node:
cur_node = self.node
self.node = cur_node.next
return cur_node.item
else:
raise StopIteration
def __iter__(self):
return self
def __init__(self, iterable=None):
# 刚开始head、tail为空
self.head = None
self.tail = None
if iterable:
self.extend(iterable)
def append(self, obj):
s = linkList.Node(obj)
if not self.head:
self.head = s
self.tail = s
else:
self.tail.next = s
self.tail = s
def extend(self, iterable):
for obj in iterable:
self.qppend(obj)
def find(self, obj):
for n in self:
if n == obj:
return True
else:
return False
def __iter__(self):
"""让链表支持for循环"""
return self.LinkListIterator(self.head)
def __repr__(self):
"""转化为字符串,打印"""
return "<<" + ",".join(map(str,self)) + ">>"
class HashTable:
"""哈希表:类似于集合"""
def __init__(self, size=101):
self.size = size
self.T = [LinkList() for i in range(self.size)]
def h(self, k):
"""哈希函数"""
return k % self.size
def insert(self, k):
"""插入k"""
i = self.h(k)
if self.find(k):
print('重复插入!!')
else:
self.T[i].append(k)
def find(self, k):
""" k"""
i = self.h(k)
return self.T[i].find(k)
lk = LinkList([1,2,3,4,5])
for element in lk:
print(element)
ht = HashTable()
ht.insert(0)
ht.insert(1)
ht.insert(102)
# 转化为字符串,打印
print(",".join(map(str,ht.T)))