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

在邻接列表表示的图中删除节点而不影响索引的策略

贲宏硕
2023-03-14

我对邻接表的理解有些困难,想听听你的意见,甚至更好的建议。:-)

0 -> 1, 2, 5
1 -> 2, 3
2 -> 1
3 -> 4
4 -> 5
adjacencies = [[1,2,5],[2,3],[1],[4],[5]]

这是5号的单子。列表中的每个索引映射到邻接符号中的一个索引。

adjacencies = [[1,2,5],[2,3],[1],[4],[5]]
#              <--0--> <-1-> <2> <3> <4>
# The angle brackets indicate which position maps to which node.

如果我们想要访问节点1的所有输出边,我们只需通过邻接[1]在允许的时间内实现这一点。

假设我想删除一个节点,例如2。

adjacencies = [[1,5],[3],[4],[5]] # Node 2 was removed from the adjacency list
#              <-0-> <1> <3> <4>

这就是我烦恼的地方。节点3现在位于位置2,这意味着通过邻接[3]访问它是错误的!每次要访问节点时,我是否必须迭代邻接列表,或者我是否误解了一些显而易见的东西?(我用Java实现了一个基于邻接列表的图结构,我很想选择map > 类型的结构,但我想了解如何在使用普通数组的同时保持索引一致性……)

谢谢你的建议!

共有1个答案

胡玉书
2023-03-14

节点的“索引”或“位置”与图本身无关。它只与您选择如何存储图有关。每个节点上的数字只是一个标签,它可以是任何东西。

数字0到5是否意味着存储位置取决于您的实现。“邻接列表”是一种概念性的图存储方式,而不是一种实现。如果使用数组实现邻接列表,并使用标签作为数组的索引,则会遇到这样的问题:删除元素变得困难,以及强制节点标签成为特定的数字。

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

  • 在Java中,从单链接列表中删除节点时遇到问题。我有一个列表,其中包含整数的数据,我需要删除所有节点,它们的值可以被四除。我还需要移动head和tail指针,以防head或tail元素被删除。我为此编写了一个方法,大多数时候,它的工作方式和我需要的一样,但有时它会抛出NullPointerException。我怎样才能修好它?这是我的密码:

  • 我有麻烦删除双向链表中的节点,程序崩溃,我不能解决这个问题。你能帮我吗?这是创建新节点,查看它们并删除它们的完整代码。 我认为这个问题与Node del的scanf()有关,但我不确定。当我只是通过或

  • 以下代码删除双链接列表中的第一个节点。 如果列表只包含1个元素,我们将last的引用设置为null。我的问题是,我们为什么不将first的引用设置为null?这会有什么不同吗?

  • 问题内容: 我正在练习使用链表节点,遇到了一个我不知道如何回答的问题。如何删除链接列表中的最后一个节点。下面的代码适用于所有条目的最后一个节点。最后一个不会被删除。 节点类别 主要 问题答案: 我想您的最后一个元素失败了。最后一个元素将没有元素。因此,不会将最后一个元素与传递的字符串进行比较。您应该使用调试器进行跟踪。

  • 问题内容: 我有一张桌子。为了快速升级/部署网站,我做了一个新表,其中包含一些新数据,方法是: 现在每个表都有一个PK列,看起来像: 重要的一点是,两个表都依赖于完全相同的序列。没有。就我的目的而言,这似乎还可以。 此后,我加载了新数据并重命名了表,以便将其作为实盘接管,而原始表变成了。现在我尝试删除: 足够公平,列默认值仍取决于顺序。 这是踢脚线。 因此,不再对序列具有任何可见的依赖关系,但是它