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

图表示为邻接表,表示为二叉树,可能吗?

谢志文
2023-03-14

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

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

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

编辑:我知道可以对数组执行二进制搜索。我说的是链表表示法,我想当我说到列表的头时,我已经说得很清楚了,但是哇哦

共有1个答案

强金鑫
2023-03-14

没有理由每个顶点的邻接列表不能存储为二叉树,但是有一些折衷。

正如您所说的,这种邻接列表表示经常用于稀疏图。通常,“稀疏图”意味着一个特定的顶点与少数其他顶点相邻。所以你的“邻接列表”对于一个特定的顶点将是非常小的。当然,二分搜索是O(logn),而顺序搜索是O(n),当n很小时,顺序搜索更快。我见过这样的情况:当n小于16时,顺序搜索胜过二分搜索。当然,这取决于实现,但不要指望二进制搜索对小列表更快。

另一个要考虑的是记忆。链表开销是每个节点一个指针。当然,除非您使用的是双链表。二叉树开销是每个节点两个指针。也许没什么大不了的,但是如果您试图表示一个非常大的图,那么这个额外的指针就变得很重要了。

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

 类似资料:
  • 在斯坦福的一门算法课程中,教授为图的邻接表表示列出了以下成分: 顶点数组或列表 边的数组或列表 顶点列表中的每个顶点都指向其上的边。 边列表中的每个边都指向其边点。 这种表示法与图形的“关联表”表示法相同吗?如果是,为什么本文认为“邻接表”和“发生率表”是分开的?

  • 在书中,他们做过这样的宣示: 我应该如何将下面图的输入作为邻接表并输出它的邻接表表示?假设,edge的每个成本是10。

  • 使用基于数组的二叉树实现,而不是旧的基于节点的实现,在速度/空间/总体性能方面有什么好处吗?我知道对基于数组的树进行旋转或任何其他复杂的修改都是可怕的,但是在简单的二叉树实现的情况下,你会说通过数组实现会更好吗?

  • 本文向大家介绍Dijkstra的邻接表表示算法,包括了Dijkstra的邻接表表示算法的使用技巧和注意事项,需要的朋友参考一下 有一个给定的图G(V,E)及其邻接列表表示形式,并且还提供了一个源顶点。Dijkstra的算法,用于找到源顶点与图G的任何其他顶点之间的最小最短路径。 为了解决这个问题,我们将使用两个列表。一种是存储已被视为最短路径树的顶点,另一种将保存尚未被考虑的顶点。在算法的每个阶段

  • 我在这里读到,对于无向图,当表示为邻接表时,空间复杂度是,其中和分别是顶点和边的个数。 我的分析是,对于一个完全连通的图,列表中的每个条目将包含节点,那么我们总共有顶点,因此,空间复杂度似乎是这似乎是我在这里遗漏了什么?

  • 广义表:(A(B(,D(E,F)),C)) 按广义表表示二叉树结构生成二叉链表的算法 BinTNode CreateTree (char str) { //str为存储广又表的按广义表表示二叉树结构生成二叉链表的算法符串的指针 BinTNode *St [100];. //用指针数组模拟栈 BinTNode *p=NULL; int top, k, j=0; top=-1; //置空栈 char