【问题标题】:Graph Representation - Linked List of Linked Lists图形表示 - 链表的链表
【发布时间】:2019-01-03 10:59:56
【问题描述】:

我知道邻接表是一种用于表示图形的常用数据结构,它使用链表数组。我正在为 C 中的简单搜索引擎实现倒排索引,并打算使用邻接列表。然而,我发现使用邻接表的一个缺点是,如果你不知道倒排索引中有多少单词,你必须假设索引中有任意大量的单词(数组元素)以创建邻接列表。这可能会导致使用过多的内存。这不是一个大问题,但我想知道是否有更好的方法来实现它。

我在想这个问题的一个解决方案是创建一个链表的链表来代替我的倒排索引。我还没有看到很多链表图形表示的链表示例,所以我假设它不是常用的或传统的表示。我想知道通常使用链表的链表来表示图形是否合适?还是坚持使用邻接列表更好?任何见解都将不胜感激。

【问题讨论】:

  • 在上层使用数组(或 mash-map)允许您在 O(1) 中访问图形的节点 - 如果您使用链接列表不是访问邻接O(v) 的特定节点列表?

标签: c data-structures graph adjacency-list


【解决方案1】:

这两种方法都需要权衡取舍。

您可以使用邻接表而不使用额外的内存,但是,每次插入和删除都会花费 O(|V|) 时间。

例如,如果您在第一次添加顶点时将数组的长度加倍,那么每次将顶点数加倍时只会花费 O(|V|) 时间。但是,使用这种方法几乎总是会占用额外的内存。

如果您选择使用 LinkedList 的 LinkedList 来表示图形,您确实可以优化内存,但会以很大的性能折衷。查找给定节点的邻居需要 O(|E|) 时间,到 O(|V||E|) 时间,这消除了邻接表的最大优势之一。

如果你想做一个更高级的操作——比如遍历图表——性能成本将是非常低效的。对于顶点的每个邻居,您必须重新遍历节点 LinkedList 才能找到相邻顶点。

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 1970-01-01
    • 2015-09-05
    • 2011-05-16
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    相关资源
    最近更新 更多