【问题标题】:What is the difference between A.length and A.heap-size?A.length 和 A.heap-size 有什么区别?
【发布时间】:2013-10-04 06:50:18
【问题描述】:

我有一个关于堆排序的问题。它在算法书中指出A.heap-size<= A.length 我不明白两者之间的区别。如果一个数组代表一个堆,为什么A.heap-size 有可能小于A.length。我知道A.heap-size代表堆内的元素个数,那为什么不完全只等于数组内的项数呢?

【问题讨论】:

  • 听起来你书中的堆排序实现使用数组的第一个“部分”作为堆,将数组的第二个“部分”用于排序的元素。堆以A.length 元素开始,但是当您删除最大元素时......堆会缩小。

标签: arrays algorithm data-structures heap


【解决方案1】:

只是为了扩展答案。进一步阅读那本书。

A.heap_size 的数组,是放置堆(max_heap 或 min_heap)结构元素的地方。它在排序或排队的范围内是有意义的。你是对的:这是堆内元素的数量,但它仅在堆排序的第一次迭代时等于A.length

在下一次迭代中,在将 max_heap 树的根 (A[1]) 与 A[i] = A[A.length](数组 A 中的最后一个元素)交换后,A[1] 元素将是 A 的最后一个元素,A.heap_sort 的值将减 1,max_heap 结构应为 max_heapified:A[Parent(i)] >= A[i],其中Parent(i) 返回堆树的 i/2。

【讨论】:

    【解决方案2】:

    在堆排序的外循环 k 次迭代后,数组由 n-k 个最小元素(A.heap-size = n-k)上的 n-k 个元素最大堆组成,然后是中的 k 个最大元素排序顺序(A.length = n)。

    【讨论】:

    • 你能说得更具体些吗?我无法理解其中的区别
    【解决方案3】:

    来自我正在使用的 Cormen 算法教科书: (这对我有帮助)

    【讨论】:

    • 在堆中为什么根节点是 A[1] 而不是 A[0]?另外,如果 A[1] 是根,那么 A[0] 是什么?
    • 堆必须被表示为一个索引为 1 的数组,而不是索引为 0 的数组,因为你为了让孩子和父母做的算术更有意义。节点 i 的左子节点将始终是节点 2i。节点 i 的右子节点将是节点 2i+1。这告诉你节点 i 的父节点是 floor(i/2)。这为节点 1 提供 1,但为节点 2 提供 1,这是不正确的,因为如果节点 0 是根,我们希望 1 和 2 成为它的子节点。
    【解决方案4】:

    A.length 给出了数组元素的总数,而 A.heap 大小给出了按排序顺序排列的元素的数量或跟随堆属性的元素的数量............和 ​​A. length-A.heap 大小,甚至现在还没有排序,将来必须排序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多