【问题标题】:Max heapify in c creating infinite recursion [closed]c中的最大heapify创建无限递归[关闭]
【发布时间】:2019-04-09 01:20:04
【问题描述】:

这是最大堆的程序,我怀疑这个算法,如果一个已经最大的堆被传递到这个函数MAX_HEAPIFY在这种情况下largest将等于i,并且直接递归调用@ 987654325@ 只会在递归中执行将无限进行

我假设数组索引从 1 开始,而不是从零开始

   MAX_HEAPIFY(A,i,heapsize){
    l=2i;
    r=2i+1;
    if(l<=heapsize&& A[l]>A[i])
      largest=l;
    else
      largest=i;
    if(r<=heapsize&&A[r]>A[largest])
      largest=r;
    if(largest!=i)
      swap(A[i],A[largest])
    MAX_HEAPIFY(A,largest)
   }

【问题讨论】:

  • 你希望l=2i; 会做什么?
  • @fvu 我编辑了先生
  • 这些都不是有效的 C,所以请发布 real 代码。无论如何,如果这是一个算法,那就错了。此代码中没有基本情况弹出;它总是递归调用,所以无论你得到这个,它都是错误的。此外,递归调用中只有 两个 参数,但无论名称代表什么,显然都有 三个
  • 我其实认为你打算写l=2*i;r=2*i+1;
  • 到底为什么要在 C 中实现二进制堆,使用索引 1 作为根?这很愚蠢。见stackoverflow.com/a/49806133/56778

标签: c algorithm data-structures heap


【解决方案1】:

复制此算法时可能会出现缩进问题。但是如果你把MAX_HEAPIFY(A,largest)放在if(largest!=i)这个条件下,那么算法是正确的。请参阅下面的算法以获得更多说明:

MAX_HEAPIFY(A,i,heapsize){
    l=2i;
    r=2i+1;
    if(l<=heapsize&& A[l]>A[i])
      largest=l;
    else
      largest=i;
    if(r<=heapsize&&A[r]>A[largest])
      largest=r;
    if(largest!=i) {
      swap(A[i],A[largest])
      MAX_HEAPIFY(A,largest)
    }
}

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2015-03-10
    • 2022-01-12
    • 2010-10-12
    相关资源
    最近更新 更多