繁体   English   中英

如何比较minHeapify中的节点以获取最小生成树?

[英]How to compare nodes in minHeapify for minimum spanning tree?

我正在尝试使用prim的算法创建最小生成树,并且我对实际堆有一个主要问题。 我将图邻接列表构造为顶点的向量,并且每个顶点都有边的向量。 边包含权重,连接顶点和关键点。 我不确定我的堆应该是顶点堆还是边堆。 如果我将其堆积为一堆顶点,则无法确定权重是否来自相同的父顶点和目标顶点,这使我认为应该为每个顶点的边列表创建一个堆。 所以我的最后一个问题是我应该创建一堆边缘还是一堆顶点? 如果是边缘列表,我应该将边缘的权重用作键,还是应该有一个单独的数据成员称为key,我可以将其实际用于优先级队列? 谢谢!

您的堆可能是成对的<vertex, weight> ,并且将包含顶点,该顶点与部分最小生成树中已有的任何顶点相距单个边缘。 (编辑:在某些情况下,它可能包含部分MST中已经存在的顶点,当这些元素弹出时,您应该忽略它们)。

它可能是像<src, dst, weight>类的边缘堆,实际上是一样的,您只是忽略srcdst与第一个变体中的vertex相同。

PS。 关于key事情,我认为不需要任何关键,您需要比较权重。

您应该制作一个minHeap边缘,因为您将按照其权重对边缘进行排序, 但是边缘应包含两个顶点:在每个端点上代表一个顶点。 否则,如您建议的那样:无法确定权重是否来自相同的父顶点和目标顶点。 因此,您应该重新构造边缘类,并对其进行minHeap堆处理。

还要考虑Wiki中的算法。

从图上任意选择一个具有单个顶点的树。

将树增加一个边缘:在将树连接到树中尚未顶点的边缘中,找到最小权重的边缘,然后将其转移到树上。

重复步骤2(直到所有顶点都在树中)。

我不完全了解边缘课程中的关键领域。 我认为这就像一个边缘的ID。 因此,您应该对其进行堆放,但是由于您要为堆提供用户定义的数据结构,因此还应该为边缘类提供比较功能,即定义bool operator<(const Edge&)方法。

堆必须使用key作为其最小的加权边来维护顶点。 由于仍未访问顶点,因此将不访问该顶点的任何边,因此,所有未访问边到未访问顶点的最小值将是下一个要添加到跨度的边,因此您删除了与之对应的顶点。 唯一的问题是,随着生成树在每次迭代中发生变化并向其中添加新的边缘,将更新的权重保持到堆中顶点的最小边缘。 这样做的方法是保持堆中每个未访问顶点的位置,当将新顶点添加到生成树时,将使用它们指向的顶点直接位置(使用存储的位置)来更新未访问边缘。 如果当前成本小于添加的新边权重,则更新顶点最小成本。 然后使用标准的堆过程将其冒泡,以维护最小堆。

数据结构: -

<Vertex,Weight> : Vertex id & weight of minimum edge to it as record of heap

position[Vertex] : The position of vertex record in heap.

注意:内置函数无法为您提供帮助,因此您需要构建自己的堆以使其高效运行。在开始时将每个顶点的键值初始化为某个无限值

另一种方法:将指向未访问顶点的所有边的权重存储在最小堆中。 但这将比其他方法需要更高的空间复杂度,但摊销时间复杂度也类似。 提取边缘时,请检查指向其的顶点是否被访问,如果访问了顶点,则再次提取并丢弃边缘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM