图表发生率列表实现

时间:2010-10-11 07:05:43

标签: java graph directed-graph

我正在考虑图形数据结构实现,并且正在查看“发生率列表”表示。这里有一个简短的描述:

Incidence list

因此,图中的每个顶点都存储了它所发生事件的边缘列表。

鉴于我的图表是有向图,我从这个描述中不太清楚几点:

  1. 图表本身是否也存储了所有边的列表?
  2. 顶点是仅存储传出边缘,还是传入和传出?
  3. 如果两者都在单独的名单中?
  4. 我对其他图形表示(邻接列表,邻接矩阵,边缘列表,关联矩阵)非常熟悉,所以这不是一般关于图形实现的问题,只是这个特定的一个。

    任何指针都会非常感激。

3 个答案:

答案 0 :(得分:2)

我知道我可能会从死里复活一个旧问题,但我觉得评论是合适的。

您可以创建一个事件列表图结构,也可以为有向图调整它。

考虑LinkedList<Vertex>对象和LinkedList<Edge>对象。这将允许您遍历所有边和所有顶点,但不包含有关所有内容如何连接的信息。

假设我们添加了几个LinkedList<Connection>个对象。事实上,每个Vertex一个。 Connection只是EdgeVertex相遇的地方。因此,Edge将有两个Connection个对象(对于无向图),Vertex将有一个LinkedList<Connection>个对象,表示与每个Edge的对象的连接连接到它。实质上,这是一个发病率清单。

如果删除其中一些Connection对象,则可以对其进行修改以表示有向图。更具体地说,您必须选择没有这些参考的地方。如果您不希望从Connection看到LinkedList<Connection>,则可以选择从关联的Edge中删除Vertex(例如上面的示例,N2会有一个空的LinkedList<Connection>)。您可以选择在Edge上使引用可选(对于上面的示例,E1将有一个Connection指向N2并且一个Connection为null,允许从E1到N2的遍历,但是没有回到N1。你选择如何实现这一点完全取决于你。一个更直观 - 边缘是直接的,所以删除边缘上的连接以指示它们走哪条路看起来是合乎逻辑的。另一个看起来有点像起初比较复杂,但是当你先做广度和深度优先搜索时,你会不必要地跳到无处可去的边缘。

以点的形式:

  1. 在我的发病率清单实施中,我有。您需要实施吗?

  2. 严格来说,只能存储传出边缘。但是,回溯算法可能会受益于能够沿着它们行进的引用回溯。当然,你可以在某种程度上实现这种历史,所以它可能不是很重要。

  3. 如果你同时做到这两点,你可能需要一些方法来区分它是传入还是传出。是通过在顶点上有两个LinkedList<Connection>对象,还是在boolean pointingToVertex上有一个Connection原语,或者其他什么。也许你的Edge会被定向,而无向边将由两个边缘指向相反的方向。根据您的结构需求进行考虑。

答案 1 :(得分:2)

我通过以下方式实施了一个事件列表,并且找不到无向图的任何问题。我也实现了几种图形拓扑算法。

HashMap<VertexT, HashSet<EdgeT>> incidenceMap;

使用集合映射保证O(1)用于顶点查找,并为边缘插入和删除分摊O(1)复杂度。保持边缘的入射列表而不是相邻的顶点列表只是携带边缘本身的某些特定信息的一种方式。这对于抽象算法也很有用,例如,当您将权重与边缘相关联时。

编辑:

我更新了维基百科上的talks以查找“发生率列表”主题。

答案 2 :(得分:0)

进一步研究和思考后,我得出结论,没有一个发病率列表图数据结构。 我认为维基百科的文章是作者心中的一些混淆的产物。 感谢所有阅读此问题并花费任何时间的人。

阿芒