数组和链表查询数据的时间复杂度为O(n)。为了提高查询的效率,散列表是一种不错的方式。散列表的功能使存储的数据按照某一类别或规则放在一起。如果n条数据能较均匀的分配在m个桶中,则我们查询的时间复杂度提高到O(n/m)。为了使单个桶中的数据元素不能过多,要支持动态扩容。设计散列表要求设定散列函数(就是按什么规则定义数据的类别),解决冲突(冲突数据的存放)以及动态扩容。
from searchAndSort.LinkedList import MyLinkedList
class MyHashTable:
buckets=[]
factor =0.7
size=0
def __init__(self,capacity=10):
self.capacity = capacity
for i in range(self.capacity):
self.buckets.append(MyLinkedList())
def hashKey(self,ele):
return ele % self.capacity
def refresh(self):
tempBuckets = self.buckets
self.buckets =[]
self.capacity = 2*self.capacity
for i in range(self.capacity):
self.buckets.append(MyLinkedList())
for link in tempBuckets:
tempNode = link.firstNode.nextNode
while tempNode != None:
ele = tempNode.element
key = self.hashKey(ele)
self.buckets[key].addNode(ele)
tempNode = tempNode.nextNode
def add(self,ele):
if self.size>self.factor*self.capacity:
self.refresh()
key = self.hashKey(ele)
self.buckets[key].addNode(ele)
self.size += 1
def remove(self,ele):
if self.size<1:
return False
key =self.hashKey(ele)
flag =self.buckets[key].removeNode(ele)
if flag:
self.size -= 1
return flag
table = MyHashTable()
table.add(1)
table.add(2)
print(table.remove(11))
for i in range(20):
table.add(i)
table.add(11)
print(table.remove(11))