Python算法与数据结构——用堆排序解决topk问题

Python算法与数据结构——用堆排序解决topk问题

topk问题

现在有n个数,设计算法得到前k大的数。(k<n)

解决思路:

  • 排序后切片 O ( n l o g n ) O(nlogn) O(nlogn)
  • 排序LowB三人组 O ( k n ) O(kn) O(kn)
  • 堆排序思路 O ( n l o g k ) O(nlogk) O(nlogk)
    1. 取列表前k个元素建立一个小根堆。堆顶就是目前第k大的数。
    2. 依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整。
    3. 遍历列表所有元素后,倒序弹出堆顶。
def sift(li, low, high):
    i = low           
    j = 2 * i + 1     
    tmp = li[low]     
    while j <= high:  
        if j + 1 <= high and li[j+1] < li[j]: 
            j = j + 1  
        if li[j] < tmp:
            li[i] = li[j]
            i = j 
            j = 2 * i + 1
        else:
            li[i] = tmp
            break
    else:
        li[i] = tmp


def topk(li, k):
    heap = li[0:k]
    for i in range((k-2)//2, -1, -1):
        sift(heap, i, k-1)
    # 1.建堆
    for i in range(k, len(li)-1):
        if li[i] > heap[0]:
            heap[0] = li[i]
            sift(heap, 0, k-1)
    # 2.遍历
    for i in range(k-1, -1, -1):
        # i指向当前堆的最后一个元素
        heap[0], heap[i] = heap[i], heap[0]
        sift(heap, 0, i-1)    # i-1是新的high
    # 3.出数
    return heap


import random
li = list(range(1000))
random.shuffle(li)
print(topk(li, 10))

堆排序

https://blog.youkuaiyun.com/weixin_74165584/article/details/143426404

视频链接

https://www.bilibili.com/video/BV1mp4y1D7UP/?spm_id_from=333.788.videopod.episodes&vd_source=ae5e7f061ec995923ad8fa7e77ca3f92

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值