问题描述:从一百万个树中找出重复次数最多的10个树
思路:最小堆+字典(伪哈希)实现
最小堆的实现见:https://blog.csdn.net/qq_41386300/article/details/89367391
代码:
import random
def heap(data_key,data_dict,root):
if 2*root+1<len(data_key):
if 2*root+2<len(data_key) and data_dict[data_key[2*root+2]]<data_dict[data_key[2*root+1]]:
k=2*root+2
else:
k=2*root+1
if data_dict[data_key[k]]<data_dict[data_key[root]]:
data_dict[data_key[root]],data_dict[data_key[k]]=data_dict[data_key[k]],data_dict[data_key[root]]
heap(data_key,data_dict,k)
# 构建最小堆
def min_heap(data_key,data_dict):
for i in range(len(data_key)//2-1,-1,-1):
heap(data_key,data_dict,i)
return data_key
# 从字典中找出重复次数最多的前k个
def topk(data_dict,k):
i=0
#最小堆列表,存放的是字典中的key
data_key=[]
for key in data_dict:
#构建最小堆
if i==k:
data_key=min_heap(data_key,data_dict)
#前k个数据直接放在列表
if i<k:
data_key.append(key)
i+=1
#第k个数据开始,每个值都与data_key[0]对比,大的话替换data_key[0],再次构建最小堆
else:
if data_dict[key]>data_dict[data_key[0]]:
# data_dict[data_key[0]]=data_dict[key]
data_key[0] = key
data_key=min_heap(data_key,data_dict)
return data_key
if __name__ == '__main__':
#随即生成一百万个数
data = [random.randint(0, 100) for i in range(1000000)]
# 用来存放重复次数的字典
data_dict = {}
for key in data:
data_dict[key] = data_dict.get(key, 0) + 1
k=10
data_key=topk(data_dict,k)
#输出结果
for i in data_key:
print(i,':',data_dict[i])