标签: heap

关于堆(最大堆和最小堆)

我有一个问题,在堆数据结构中,左孩子可以比其所在级别的右孩子多吗?我的意思是,考虑这三个数字 9、5、8,我想创建一个最大堆数据结构,因此根将为 9,并且 8 是其左子节点,5 是其右子节点,这是真的吗?请帮助我,谢谢

heap

0
推荐指数
1
解决办法
2777
查看次数

如何从最大堆中删除?

如果我们把15放在root中,heapify的过程是什么?

            85
            /\
           /  \
          /    \
        55      70
        /\      /\
       /  \    /  \
      22  33  30  65
     /\   /
   14 15 15
Run Code Online (Sandbox Code Playgroud)

从Heap中删除85的方法应该是什么?

heap binary-search-tree

0
推荐指数
1
解决办法
2万
查看次数

make_heap 使用函数对象

我必须为 make_heap 重载什么运算符?是 () 运算符吗?如果我已经在我的算法中为另一个案例定义了它。任何人都可以提供在我的情况下使用 make_heap 的正确方法。请参阅下面的代码以更好地理解。

在我有的顶点类中

bool operator() (vertex &v) const 
{ 
  return (v.key() == _key); 
}
Run Code Online (Sandbox Code Playgroud)

这在以下 std 方法 find_if 中构建图形时使用

vertex_iterator GraphComponents::graph::find_vertex_by_key(int key)
{
  return std::find_if(_vertices.begin(), _vertices.end(), GraphComponents::vertex(key));
}
Run Code Online (Sandbox Code Playgroud)

现在在我的算法中,我想在不同的上下文中使用顶点作为函数对象。

std::list<int> GraphComponents::graph::breadth_first_search (int key, int start_key)
{
  std::vector<GraphComponents::vertex *> heap;
  for (vertex_iterator copy_iter = _vertices.begin(); copy_iter != _vertices.end(); ++copy_iter) {
    heap.push_back(&(*copy_iter));
  }
  std::make_heap(heap.begin(), heap.end(), vertex(<should be distance>));
}
Run Code Online (Sandbox Code Playgroud)

这里我不想在比较中使用键,但我想使用距离成员,因此距离最短的顶点位于堆的顶部。短于实现我自己的堆,推荐的方法是什么?

c++ heap stl graph

0
推荐指数
1
解决办法
1203
查看次数

Python捕获异常但打印它们

我已经建立了一个最大堆,并尝试提取max,只要有元素.如果没有我正在返回IndexError.这是我正在尝试执行的代码:

while True:
    try:
        print hp.extract_max()
    except:
        break
Run Code Online (Sandbox Code Playgroud)

并在extract_max()方法中:

def extract_max(self):
    if self.size == 0:
        return IndexError
    item = self.items[0]
    self.items[0] = self.items[self.size - 1]
    self.heapify_down()
    del self.items[len(self.items) - 1]
    return item
Run Code Online (Sandbox Code Playgroud)

但是,代码在遇到IndexError时没有破坏,而是打印它.在同时循环不打破.

<type 'exceptions.IndexError'>
<type 'exceptions.IndexError'>
....
Run Code Online (Sandbox Code Playgroud)

它不断打印异常,而不会打破循环.

有什么问题?

python heap loops exception index-error

0
推荐指数
1
解决办法
50
查看次数

优先级队列和最小/最大堆有什么区别?

我知道最小和最大堆的工作方式,但是对于优先级队列是什么以及它有何不同感到困惑。任何帮助将不胜感激。

heap queue

0
推荐指数
1
解决办法
1318
查看次数

为什么我们需要在堆中创建一个对象?

为什么我们可以使用堆栈满足我们的所有需求?

注意:如果您在解释时给出一个例子,那将是非常好的,因为通过示例更容易理解.

抱歉英语不好.

c++ memory heap stack

0
推荐指数
1
解决办法
395
查看次数

根为arr [0]的二进制堆有什么好处?

我在数组上写二进制堆arr

除叶节点外,每个节点都有两个子节点。

根可以是arr[0]arr[1]

为什么在由数组实现的堆中未使用索引0的可接受答案 arr[1]更快。

但是在该答案下方的一条评论说,大多数实现都扎根于arr[0]

扎根的好处是什么arr[0]

c++ heap

0
推荐指数
1
解决办法
353
查看次数

如何在堆中分配值类型数组?

我读了一些类似问题的答案,但我的问题没有什么不同,因为我不理解在书中写的关于这个问题的陈述.

因为struct是值类型,所以每个实例都不需要在堆上实例化对象; 这在创建类型的许多实例时会产生有用的节省.例如,创建值类型的数组只需要一个堆分配.

我的意思是数组如何只需要一个堆分配?...或单个堆分配是什么意思

c# arrays heap struct value-type

0
推荐指数
1
解决办法
130
查看次数

自定义堆中的分段错误

它甚至不执行推送操作。它不调用推送函数,只是构造函数调用和分段错误。为什么会这样?

class Heap {
    vector<int> v;

     void Heapify(int x) {
        int mi = x;
        int l = 2 * x;
        int r = 2 * x + 1;

        if (v[mi] > v[l] && l < v.size()) {
            mi = l;


        }
        if (v[mi] > v[r] && r < v.size()) {
            mi = r;
        }

        if (mi != x) {
            swap(v[mi], v[x]);
            Heapify(mi);
        }
                       }
public:
    Heap() {

        v[0] = -1;
    }
    void push(int x) {

        v.push_back(x);
        int i = v.size()-1; …
Run Code Online (Sandbox Code Playgroud)

c++ heap priority-queue c++11

0
推荐指数
1
解决办法
94
查看次数

java有堆数据结构吗?

我正在大学学习数据结构和算法,我在教科书中遇到了霍夫曼代码。我尝试在 Visual Studio 代码上运行代码,但收到堆数据结构的错误消息。消息是:

堆无法解析为类型

代码如下:

Heap<Tree> heap = new Heap<>(); // Defined in Listing 24.10      
Run Code Online (Sandbox Code Playgroud)

我还尝试将堆更改为优先级队列,但随后 getSize() 方法显示错误。

java algorithm heap data-structures

0
推荐指数
1
解决办法
99
查看次数