使用堆数据结构查找最小值并在列表上进行一些计算

时间:2018-11-06 12:03:25

标签: python sorting heap

我正在研究堆,并在hackarank中尝试了一个问题。

问题是要在列表中找到达到某个值K所需的次数。如果任何值小于K:则将添加前两个最小值,并放置新值而不是这两个值。

我已经完成了解决方案的编码。但是,请说明我可以做的任何改进以使代码运行更快。

我的代码:

import heapq as heap

data = map (int, raw_input ().strip ().split ())
N, K = data [0], data [1]

cookies = map (int, raw_input ().strip ().split ()) 
heap.heapify (cookies)
numOps = 0
possibility = False

while cookies [0] < K:
    if N == 1:
        possibility = True
        break
    leastSweetCookies = heap.nsmallest (2, cookies)
    heap.heapreplace (cookies, leastSweetCookies [0] + 2 * leastSweetCookies [1])
    heap.heappop (cookies)
    numOps += 1
    N -= 1
if possibility == False: print numOps
else: print -1

1 个答案:

答案 0 :(得分:0)

这三行:

leastSweetCookies = heap.nsmallest (2, cookies)
heap.heapreplace (cookies, leastSweetCookies [0] + 2 * leastSweetCookies [1])
heap.heappop (cookies)

等同于:

sw1 = heap.heappop(cookies);
sw2 = heap.heappop(cookies);
heap.heappush(cookies, sw1 + 2*sw2);

在您的代码中,对nsmallest的调用可能会遍历整个堆以找到2个最小的项。然后是替换顶部元素的O(log n),弹出最小元素的O(log n)。

在替换代码中,两个弹出窗口的每一个均为O(log n),而推送则为O(log n)。所以:

您的代码:O(n)+ O(log n)+ O(log n)

我的代码:O(log n)+ O(log n)+ O(log n)