当前位置: 首页 > 知识库问答 >
问题:

为Prim的c实现设计数据结构

张逸清
2023-03-14

我正在尝试在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。那么有什么优雅的方法可以做到这一点吗?它仍然可以保留复杂性?

共有1个答案

楚乐逸
2023-03-14

基本上确实需要在数据结构之间进行一些交叉引用。然而,你写

但在最小堆操作期间跟踪位置会很麻烦

这是不正确的。通过使用以下内容,您可以重用或编写不需要的可重用数据结构。

>

  • 首先,您的优先级队列需要公开某种迭代器,它允许 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语言实现的版本 运行结果如下所示: 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!