Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找最小值并使用堆数据结构对列表进行一些计算_Python_Sorting_Heap - Fatal编程技术网

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

Python 查找最小值并使用堆数据结构对列表进行一些计算,python,sorting,heap,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_inp

我正在研究堆并在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
将heapq导入为堆
data=map(int,原始输入().strip().split())
N、 K=数据[0],数据[1]
cookies=map(int,原始输入().strip().split())
heap.heapify(cookies)
numOps=0
可能性=错误
而cookies[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
的调用可能会迭代整个堆,以找到最小的两个项。然后是一个O(logn)来替换顶部元素,O(logn)来弹出最小的元素

在替换代码中,两个POP中的每一个都是O(logn),推送是O(logn)。因此:

你的代码:O(n)+O(logn)+O(logn)

我的代码:O(logn)+O(logn)+O(logn)