使用堆数据结构查找最小值并在列表上进行一些计算
Finding minimum and do some calculations on list using heap data structure
我正在研究堆并在 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
这三行:
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)的替换top元素,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)
我正在研究堆并在 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
这三行:
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)的替换top元素,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)