我知道邻接列表是使用链表列表表示图形的通用数据结构.我正在为C中的简单搜索引擎实现倒排索引,并且将使用邻接列表.但是,我发现使用邻接列表的一个缺点是,如果你不知道倒排索引中有多少个单词,你必须假设索引中有任意大量的单词(数组元素)以创建邻接列表.这可能导致使用过多的内存.这不是一个大问题,但我想知道是否有更好的方法来实现它.
我认为这个问题的一个解决方案是创建一个链表的链表来代表我的倒排索引.我还没有看到很多链表的图表链接列表的示例,所以我假设这不是常用的或传统的表示.我想知道使用链表的链表来表示一般的图表是否合适?或者更好地坚持使用邻接列表?任何见解都会非常感激.
最佳答案 两种方法都存在权衡.
您可以在不使用额外内存的情况下使用邻接列表,但是,每次插入和删除都需要花费O(| V |)时间.
例如,如果你第一次添加顶点时,你的数组长度加倍,那么每次加倍顶点数时,只需要花费O(| V |)时间.但是,使用这种方法几乎总是会占用额外的内存.
如果您选择使用LinkedList的LinkedList表示图形,那么您确实可以优化内存,但需要进行大的性能权衡.查找给定节点的邻居从O(| E |)时间到O(| V || E |)时间,这消除了邻接列表的一个最大优点.
如果您想进行更高级的操作(如遍历图表),性能成本将非常低效.对于顶点的每个邻居,您必须重新遍历节点LinkedList才能找到相邻顶点.