我正在尝试在C中实现MST的Prim算法。我有一个设计问题
我实现了一个min-heap,它需要一个整数,我们可以提取min、减少键和插入键。
现在,正如我在Prim的理解,我需要维护每个顶点的权重和邻居信息。我的一些想法是:
1]定义结构
struct node {
int vertex;
int weight;
int neighbor;
};
使用min堆以最小权重返回节点。但是问题是减少键,因为对于减少键,调用者需要传递他想要减少键的顶点。由于堆交换元素的频率太高,我必须遍历整个列表以找到顶点,然后减少它的键。这是O(n),我认为如果我这样做,Prim的情况会变得更糟。
2] 另一种方法是维护另一个数组,它跟踪最小堆队列中顶点的位置。但在最小堆操作期间跟踪位置会很麻烦。
基本上,如果我必须执行降键(v),如何在基于权重的min-heap队列中找到v。那么有什么优雅的方法可以做到这一点吗?它仍然可以保留复杂性?
基本上确实需要在数据结构之间进行一些交叉引用。然而,你写
但在最小堆操作期间跟踪位置会很麻烦
这是不正确的。通过使用以下内容,您可以重用或编写不需要的可重用数据结构。
>
首先,您的优先级队列需要公开某种迭代器,它允许 O(1) 访问。为此,您可以使用提升。直接堆砌
(请参阅下面的注释),或者从那里获得有关界面外观的想法。
现在您使用另一种数据结构,它将(在O(1)中)节点标签映射到队列的迭代器。例如,如果节点标签是(连续的)整数,您可以使用迭代器的向量
;如果它们基本上是其他任何东西,您可能应该使用unordered_map
。
每个节点结构还需要包括2中数据结构使用的标签。
项目3。意味着您需要在上面的代码中添加以下内容。
struct node {
...
// Identifies
Label label;
};
请注意这是如何允许您将优先级队列与其他数据结构分离的。当您执行< code>decrease_key时,您的< code >节点在优先级队列中移动,您不需要担心任何事情,因为每个节点都包含< code>label成员。
说了这么多,你还应该考虑简单地使用已经有Prim算法的Boost图形库。
本文向大家介绍C++ 数据结构 堆排序的实现,包括了C++ 数据结构 堆排序的实现的使用技巧和注意事项,需要的朋友参考一下 堆排序(heapsort)是一种比较快速的排序方式,它的时间复杂度为O(nlgn),并且堆排序具有空间原址性,任何时候只需要有限的空间来存储临时数据。我将用c++实现一个堆来简单分析一下。 堆排序的基本思想为: 1、升序排列,保持大堆;降序排列,保持小堆; 2、建立堆之后,将
null 高++;storage.put(high,element); 低++; 高--;
本文向大家介绍使用C#实现数据结构堆的代码,包括了使用C#实现数据结构堆的代码的使用技巧和注意事项,需要的朋友参考一下 一、 堆的介绍: 堆是用来排序的,通常是一个可以被看做一棵树的数组对象。堆满足已下特性: 1. 堆中某个节点的值总是不大于或不小于其父节点的值 任意节点的值小于(或大于)它的所有后裔,所以最小元(或最大元)在堆的根节点上(堆序性)。堆有大根堆和小根堆,将根节点最大的堆
本文向大家介绍C语言实现数据结构迷宫实验,包括了C语言实现数据结构迷宫实验的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C语言实现简单的数据结构迷宫实验,供大家参考,具体内容如下 分析:迷宫实验主要有两部分操作,其一是对迷宫的生成,其二是寻路使用栈的操作。 步骤: 一、.h文件 1、首先是迷宫的生成,可以使用随机数种子生成,但主要逻辑部分并不在此,所以在这里直接写死,固定下来。 定
8.1节中,我们看到了各种划分方法;并且在8.2节,了解了对性能影响的各种因素。如何在设计数据结构的时候,使用这些信息提高多线程代码的性能?这里的问题与第6、7章中的问题不同,之前是关于如何设计能够安全、并发访问的数据结构。在8.2节中,单线程中使用的数据布局就会对性能产生巨大冲击(即使数据并未与其他线程进行共享)。 关键的是,当为多线程性能而设计数据结构的时候,需要考虑竞争(contention
本文向大家介绍C语言数据结构实现字符串分割的实例,包括了C语言数据结构实现字符串分割的实例的使用技巧和注意事项,需要的朋友参考一下 C语言数据结构实现字符串分割的实例 以下为“字符串分割”的简单示例: 1. 用c语言实现的版本 运行结果如下所示: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!