我刚刚发现了堆(在现实生活中和在Python中),现在我正在尝试确定某个随机数列表是否按堆顺序排列。
问题是我不确定自己是否真的理解“堆”在实践中,即使我相信提供的定义是有道理的。
我发现了一些可以帮助你编写堆伪代码的练习题。 这就是问题所在,我的尝试是解决它:
编写一个检查数字列表是否为堆的函数:
给定一个列表,如果数字是堆排序,则返回True;如果数字不是,则返回False,并返回程序并打印答案。
示例:
然后有2个列表,其中有一堆随机数从1 - 100抛出,有些重复。
def heap_or(A):
n = len(A)
for i in range(n):
start = (len(A) - 2) / 2
while start >= 0:
siftDown(A, start, len(A) - 1)
start -= 1:
return 'True'
else:
return 'False'
def siftDown(A, start, end):
root = start
while root * 2 + 1 <= end:
number = root * 2 + 1
if number + 1 <= end and A[number] < A[number + 1]:
number += 1
if number <= end and A[root] < A[number]:
A[root], A[number] = A[number], A[root]
root = number
else:
return
print
有人可以帮我一把吗?因为我不确定我是否正确定义了堆,代码也让我很难过!
答案 0 :(得分:2)
堆属性(对于最大堆)是每个节点应该大于或等于其父节点。存储在数组中的二进制堆中的元素i
的父元素是元素(i - 1) // 2
:
def is_heap(A):
return all(A[i] >= A[(i - 1) // 2] for i in range(1, len(A)))
显然因为堆存储在数组中,我们不需要检查形状。