甲堆,也被称为优先级的队列,是一个抽象的数据类型。从概念上讲,它是一个二叉树,其中每个节点的子代小于或等于节点本身。(假定它是一个最大堆。)当元素被推入或弹出时,堆会重新排列自身,因此最大的元素是下一个要弹出的元素。它可以很容易地实现为树或数组。
您应该选择接受的挑战是,确定数组是否为有效堆。如果每个元素的子元素小于或等于元素本身,则该数组为堆形式。以以下数组为例:
[90, 15, 10, 7, 12, 2]
实际上,这是一个以数组形式排列的二叉树。这是因为每个元素都有孩子。90岁有两个孩子15和10。
15, 10,
[(90), 7, 12, 2]
15岁还有7岁和12岁的孩子:
7, 12,
[90, (15), 10, 2]
10个有孩子:
2
[90, 15, (10), 7, 12, ]
而下一个元素也将是10的孩子,除了没有空间。如果数组足够长,则7、12和2也都将有子级。这是堆的另一个示例:
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
这是先前数组制作的树的可视化效果:
以防万一这还不够清楚,这是获取第i个元素的子元素的显式公式
//0-indexing:
child1 = (i * 2) + 1
child2 = (i * 2) + 2
//1-indexing:
child1 = (i * 2)
child2 = (i * 2) + 1
您必须采用非空数组作为输入,并且如果该数组按堆顺序输出,则必须输出真实值,否则必须输出伪值。只要指定程序/函数期望的格式,它就可以是0索引堆或1索引堆。您可以假设所有数组仅包含正整数。您不能使用任何堆内置的。这包括但不限于
- 确定数组是否为堆形式的函数
- 将数组转换为堆或堆形式的函数
- 将数组作为输入并返回堆数据结构的函数
您可以使用此python脚本来验证数组是否为堆形式(索引为0):
def is_heap(l):
for head in range(0, len(l)):
c1, c2 = head * 2 + 1, head * 2 + 2
if c1 < len(l) and l[head] < l[c1]:
return False
if c2 < len(l) and l[head] < l[c2]:
return False
return True
测试IO:
所有这些输入都应返回True:
[90, 15, 10, 7, 12, 2]
[93, 15, 87, 7, 15, 5]
[16, 14, 10, 8, 7, 9, 3, 2, 4, 1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[100, 19, 36, 17, 3, 25, 1, 2, 7]
[5, 5, 5, 5, 5, 5, 5, 5]
所有这些输入都应返回False:
[4, 5, 5, 5, 5, 5, 5, 5]
[90, 15, 10, 7, 12, 11]
[1, 2, 3, 4, 5]
[4, 8, 15, 16, 23, 42]
[2, 1, 3]
像往常一样,这是代码高尔夫球,因此存在标准漏洞,并且以字节为单位的最短答案为胜!
[3, 2, 1, 1]
?