【问题标题】:Determining if a list of numbers is in heap order, Python 3.2确定数字列表是否按堆顺序排列,Python 3.2
【发布时间】:2013-05-07 08:34:20
【问题描述】:

我刚刚发现了堆(在现实生活中和 Python 中),现在我正在尝试确定某个随机数列表是否按堆顺序排列。
问题是我不确定自己在实践中是否真的理解“堆”,即使我相信所提供的定义是有道理的。

我发现了一些可以帮助您编写堆伪代码的练习题。 这就是问题所在,下面是我尝试解决的问题:

编写一个检查数字列表是否为堆的函数:

给定一个列表,如果数字按堆顺序返回 True,如果数字不是,则返回 False,并让程序返回并打印答案。

例子:

  • 返回真: 以下列表按堆顺序排列:[0,1, 10, 2, 3, 11, 12, 4, 5, 19, 15]
  • 返回 False 以下列表未按堆顺序排列:[0, 1, 10, 2, 15, 11, 12, 4, 5, 19, 3]

然后有 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 

有人可以帮帮我吗?因为我不确定我是否正确定义了堆,所以代码也给我带来了困难!

【问题讨论】:

  • 我们可以帮助您,但您也应该包括您对 siftDown 的实现
  • @jamylak 我几乎可以肯定这是不正确的,因为我试图模仿别人的最小/最大堆排序,但我现在无论如何都会将它添加到我的原始帖子中!
  • @jamylak - 所以你认为你现在可以帮助我吗?
  • 在这里我虽然堆是一个树结构。
  • 相关:heapq module

标签: python sorting python-3.x heap python-3.2


【解决方案1】:

堆属性(对于最大堆)是每个节点都应该大于或等于其父节点。存储在数组中的二进制堆中元素i的父元素是元素(i - 1) // 2

def is_heap(A):
    return all(A[i] >= A[(i - 1) // 2] for i in range(1, len(A)))

显然因为堆存储在数组中,我们不需要检查形状。

【讨论】:

  • 您好,感谢您的回复。我不是在寻找最大堆 - 这有关系吗?那么,假设我有上述列表之一或任何其他列表,我将如何解决这个问题? A = [1,2,4,5,3,2,5,2] def is_heap(A): return all(A[i] &gt;= A[(i - 1) // 2] for i in range(1, len(A))) 更重要的是,我将如何让它向我展示答案,对还是错?再次感谢!
  • @user2227808 你心里一定有一些比较功能;如果那是&gt;=,那么你有一个最大堆。如果你真的想要一个字符串作为结果,只需使用str
  • 抱歉没说清楚!我想我只是对应该将打印函数放在哪里感到困惑,所以 Python 解释器会告诉我它是 True 还是 False。我尝试将它放在 return all 之前并添加一对额外的括号,但返回了“无效的合成器”。
  • 没关系,想通了,愚蠢的问题!再次感谢您的帮助!
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 2012-12-11
相关资源
最近更新 更多