微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我应该如何解决堆选择问题?

如何解决我应该如何解决堆选择问题?

我试图在无序数组中找到第k个最小的元素。我应该使用两个"tasks": [ { "label": "groovy","type": "shell","command": "groovy ${file}" } ] ,其中第一个具有所有数组键,第二个具有h1的根作为唯一元素。该算法应迭代k-1次,并在每次迭代中提取h2的根,并将其在第一堆中的对应子代插入h2中。在第k次迭代中执行此操作,这是我希望的元素,它将是第二个堆的根。算法复杂度应为min-heaps h1,h2,因为初始化栈需要花费线性时间,而在堆中插入k个元素则需要花费O(n+k*logk)

输入中的元素可以重复多次,因此发生某些输入时我的程序陷入了一个循环,在循环中它继续在h2上插入相同的子代。例如,如果我提取一个键为5的节点,并且h1上的相同节点有两个孩子,其子键等于5和8,则在h2上插入5和8,但是在下一次迭代中提取5的它继续插入5和8

我已经试图通过在h2上插入节点的索引而不是它们的键来解决此问题,但这没有用。

我应该如何解决这个问题?

O(k*logk)

解决方法

解决方案是在辅助堆中存储索引和值。这是可以在Python中完成的方法:

import heapq

def heapselect(x,k):
    """Return k-th smallest element of x"""
    heapq.heapify(x)
    s = [(x[0],0)] #auxiliary heap
    for _ in range(k-1):
        ind = heapq.heappop(s)[1]
        if 2*ind+1 < len(x):
            heapq.heappush(s,(x[2*ind+1],2*ind+1))
        if 2*ind+2 < len(x):
            heapq.heappush(s,(x[2*ind+2],2*ind+2))
    return s[0][0]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。