使用Python heapq.heapify(Array)

问题描述 投票:0回答:1

Python:我想使用 heapq.heapify(Arr) 但每次我想要使用数组切片而不为新数组创建新的内存分配。我希望数组的其余部分保持原样。示例: heapq.heapify(arr[0:3]) 并在某些计算中使用 arr[3::] 的其余部分,并继续在循环中更改此切片宽度。我可以做吗?在这种情况下,我没有看到 arr 被堆积

python-3.x heap
1个回答
0
投票

您可以使用自定义

_heapify()
,但根据您的实现,它可能需要额外的空间,除非您实现整个堆:

import heapq

def _heapify(arr, s, e):
    partition = arr[s:e]
    heapq.heapify(partition)
    arr[s:e] = partition


arr = [i + 1 for i in range(10, 30)]

res = []
for i in range(1, len(arr) - 2):
    _heapify(arr, 0, i + 3)
    res += (arr[:i + 3], arr[i + 3:])

print(res)

打印

[[11, 12, 13, 14], [15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16], [17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19], [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20], [21, 22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21], [22, 23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22], [23, 24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24], [25, 26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26], [27, 28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27], [28, 29, 30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28]、[29、30]、[11、12、13、14、15、16、17、18、19、20、21、22、23、 24, 25, 26, 27, 28, 29], [30], [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30], []]

© www.soinside.com 2019 - 2024. All rights reserved.