【问题标题】:Deleting ith index in minimum heap删除最小堆中的第 i 个索引
【发布时间】:2018-01-22 09:05:31
【问题描述】:

谁能解释一下删除由数组表示的最小堆中的第i个元素并在删除操作后保持堆属性的概念。

第 i 个节点的左子节点: 2*i + 1

第 i 个节点的右孩子: 2*i + 2

第 i 个节点的父节点: (i-1)/2

这就是我尝试过的方法,但这并不能正确处理所有条件:

void deleteKey(int i)
{
  if(i > capacity && i < 0)  //capacity : max size of heap
     return;

  heap_size--;               //current heap size

  //swapping last & required elements
  harr[heap_size] = harr[heap_size] ^ harr[i];  //harr[] : heap array
  harr[i] = harr[heap_size] ^ harr[i];     
  harr[heap_size] = harr[heap_size] ^ harr[i];

  int j = heap_size - 1;

  while(2*i <= j)
  {
     if(left(i)<= j)  //if there's only left node
     {
        if(right(i) <= j)  //if there is right too
        {
           //finds index with min value
           int x = harr[left(i)] < harr[right(i)] ? left(i) : right(i);

           //swaps array elements
           swap(&harr[x] , &harr[i]);

           //updating current & required node
           i = x;
        }

        else
        {
           swap(&harr[left(i)], &harr[i]);
           i = left(i); //updating current & required node
        }
     }
  }
}

【问题讨论】:

  • “2*1 + 1”是“2 * i + 1”?
  • 有人能解释一下删除以数组表示的最小堆中的第i个元素并在删除操作后保持堆属性的概念 -- 你不知道一个概念,但是您编写了一个程序来实现您想要解释的概念。令人困惑...
  • @PaulMcKenzie 感谢您对我的努力表示赞赏。是的,我还在学习。当我完成这段代码后,我会告诉你:)
  • 数组索引用于回溯
  • 您尝试的示例输入是什么以及您是如何得出结论它不起作用的

标签: c++ data-structures heap


【解决方案1】:

This是我在逛街时遇到的最美的解释。求知者,来看看吧!

【讨论】:

  • 不鼓励仅链接的答案。链接可能会过时。您应该考虑添加概述解决方案的文本,并提供链接作为来源,以便其他人在需要时可以访问。
【解决方案2】:

这里有一个非常好的解决方案。只需检查最小堆的删除操作即可。

http://www.geeksforgeeks.org/binary-heap/

【讨论】:

  • 你发现了什么错误?
  • 实际上,我的算法无法处理的情况很少。我找到了一个惊人的解释,而且效果很好。
  • 这不是最好的方法。在 cmets 中查看我的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 2012-05-18
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2017-11-24
  • 2019-07-23
相关资源
最近更新 更多