图表表示为邻接列表,作为二叉树,是否可能?

时间:2016-12-29 08:36:19

标签: algorithm data-structures graph time-complexity binary-tree

首先道歉,英语不是我的第一语言。

所以这是我对图表的理解,表示为相关列表:它通常用于稀疏图形,大多数图形都是这种情况,它使用V(顶点数)列表。因此,V头指针+ 2e(边缘数)节点用于无向图。因此,空间复杂度= O(E + V) 由于任何节点都可以有最多V-1个边(不包括它自己),因此它具有O(V)的时间复杂度来检查节点的邻接。

至于检查所有边缘,需要O(2e + V)所以O(v + e) 现在,因为它主要用于稀疏图,所以很少用O(v)来检查邻接,而只是给定顶点的边数(最好是O(V),因为V-1是可能的最大值)

我想知道的是,是否可以制作列表(边缘节点)二叉树?因此,为了确定节点A是否与节点B相邻,时间复杂度将是O(logn)而不是线性O(n)。 如果有可能,它实际上经常完成吗?那么,那种数据结构叫什么?如果这样的组合可能但我找不到任何东西,我一直在谷歌搜索。如果有人能够详细解释这一点,我将非常感激,因为我是数据结构的新手。谢谢。

编辑:我知道可以在数组上执行二进制搜索。我在谈论链表表示,我以为当我说到列表但是哇

时我明白了

1 个答案:

答案 0 :(得分:0)

没有理由不能将每个顶点的邻接列表存储为二叉树,但存在传统。

正如您所说,此邻接列表表示通常用于稀疏图。通常,“稀疏图”意味着特定顶点与其他几个顶点相邻。因此,特定顶点的“邻接列表”将非常小。而二进制搜索确实是O(log n)而顺序搜索是O(n),而当n非常小时,顺序搜索更快。我已经看到当n小于16时顺序搜索胜过二进制搜索的情况。当然,这取决于实现,但不要指望二进制搜索对于小列表更快。

要考虑的另一件事是记忆。链表开销是每个节点一个指针。当然,除非您使用双向链表。二叉树开销是每个节点两个指针。也许不是什么大问题,但如果你想要代表一个非常大的图形,那么额外的指针就会变得很重要。

如果图表在运行时经常更新,您也必须考虑到这一点。将新边添加到链的边列表是O(1)操作。但是为二叉树添加边缘将需要O(log n)。而且你想确保你保持树平衡。不平衡的树开始像链表一样。

所以,是的,你可以让你的邻接列出二叉树。您必须根据应用程序的速度要求和数据的性质来决定是否值得付出额外的努力。