【发布时间】:2011-02-24 05:28:13
【问题描述】:
我需要存储一个有向图(不一定非循环),以便节点删除尽可能快。我不介意存储额外的数据,以便确切知道删除节点时必须走哪些边。
如果我存储一个边列表(作为节点索引对),那么当杀死某个节点 n 时,我必须在整个列表中搜索其源或目标为 n 的边。这对我的申请来说太昂贵了。是否可以通过在节点中存储一些额外的数据来避免这种搜索?
一个想法是让每个节点将其自己的源和目标存储为两个单独的列表。当节点 n 被杀死时,它的列表也被杀死。但是,链接到节点 n 的所有目标/源如何知道更新他们自己的列表(即,从他们的列表中删除已失效的节点)?这将需要一些昂贵的搜索...
可以避免吗?
谢谢。
【问题讨论】:
-
每个顶点有多少条边(通常)?如果顶点度数较低,您建议的邻接列表搜索可能不会太昂贵,特别是如果邻接列表按某种顶点 ID 排序以允许二进制搜索。请记住,由于已删除的顶点有自己的源和目标列表,因此您将知道任何给定顶点的所有相邻顶点。
-
通常,一个顶点大约有 10-30 条入边和大约 5-10 条出边。但是一些顶点可能有数百个外边。保持邻接列表排序的想法可能会奏效......不过,这意味着我必须在创建新顶点时花时间对这些列表进行排序。
标签: algorithm graph directed-graph