我有一个问题,在堆数据结构中,左孩子可以比其所在级别的右孩子多吗?我的意思是,考虑这三个数字 9、5、8,我想创建一个最大堆数据结构,因此根将为 9,并且 8 是其左子节点,5 是其右子节点,这是真的吗?请帮助我,谢谢
如果我们把15放在root中,heapify的过程是什么?
85
/\
/ \
/ \
55 70
/\ /\
/ \ / \
22 33 30 65
/\ /
14 15 15
Run Code Online (Sandbox Code Playgroud)
从Heap中删除85的方法应该是什么?
我必须为 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)
这里我不想在比较中使用键,但我想使用距离成员,因此距离最短的顶点位于堆的顶部。短于实现我自己的堆,推荐的方法是什么?
我已经建立了一个最大堆,并尝试提取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)
它不断打印异常,而不会打破循环.
有什么问题?
我知道最小和最大堆的工作方式,但是对于优先级队列是什么以及它有何不同感到困惑。任何帮助将不胜感激。
为什么我们可以使用堆栈满足我们的所有需求?
注意:如果您在解释时给出一个例子,那将是非常好的,因为通过示例更容易理解.
抱歉英语不好.
我在数组上写二进制堆arr。
除叶节点外,每个节点都有两个子节点。
根可以是arr[0]或arr[1]。
为什么在由数组实现的堆中未使用索引0的可接受答案 ?说arr[1]更快。
但是在该答案下方的一条评论说,大多数实现都扎根于arr[0]。
扎根的好处是什么arr[0]?
我读了一些类似问题的答案,但我的问题没有什么不同,因为我不理解在书中写的关于这个问题的陈述.
因为struct是值类型,所以每个实例都不需要在堆上实例化对象; 这在创建类型的许多实例时会产生有用的节省.例如,创建值类型的数组只需要一个堆分配.
我的意思是数组如何只需要一个堆分配?...或单个堆分配是什么意思
它甚至不执行推送操作。它不调用推送函数,只是构造函数调用和分段错误。为什么会这样?
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) 我正在大学学习数据结构和算法,我在教科书中遇到了霍夫曼代码。我尝试在 Visual Studio 代码上运行代码,但收到堆数据结构的错误消息。消息是:
堆无法解析为类型
代码如下:
Heap<Tree> heap = new Heap<>(); // Defined in Listing 24.10
Run Code Online (Sandbox Code Playgroud)
我还尝试将堆更改为优先级队列,但随后 getSize() 方法显示错误。