【发布时间】:2016-11-27 15:42:17
【问题描述】:
您能否给我一些线索,说明如何使用邻接列表/集合来实现图形以及它是如何工作的 有向图?无向图?加权图?
【问题讨论】:
-
最好问一个具体的问题。例如:“如何使用 Java 中的邻接表或集合来实现有向图”?
您能否给我一些线索,说明如何使用邻接列表/集合来实现图形以及它是如何工作的 有向图?无向图?加权图?
【问题讨论】:
考虑一个像这样的有向无环图:
1->2
1->3
2->4
2->5
3->6
3->7
另一种查看方式是:
1
/ \
2 3
/ \ / \
4 5 6 7
这实际上只是一棵小二叉树。邻接表表示形式如下:
1 -> {2, 3}
2 -> {4, 5}
3 -> {6, 7}
因此考虑这可能是指向整数集的整数 HashMap。
现在考虑原始图是无向的,也就是说有父指针。
1<->2
1<->3
2<->4
2<->5
3<->6
3<->7
现在表示需要更多条目:
1 -> {2, 3}
2 -> {1, 4, 5}
3 -> {1, 6, 7}
4 -> {2}
5 -> {2}
6 -> {3}
7 -> {3}
让我们回到图形的有向版本并对其加权:
权重是元组中的第一个条目,子元素是第二个条目。所以它看起来像Parent->(Weight, Child)。
1->(.9,2)
1->(.1,3)
2->(.9,4)
2->(.1,5)
3->(.5,6)
3->(.5,7)
所以 90% 的时间我们从 1->2 开始,然后 90% 的时间我们会从 2->4 开始。
表示看起来与有向图非常相似:
1 -> {(.9,2), (.1,3)}
2 -> {(.9,4), (.1,5)}
3 -> {(.5,6), (.5,7)}
希望这会有所帮助。
【讨论】: