topk问题----重复次数问题 python实现

问题描述:从一百万个树中找出重复次数最多的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])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值