首先,需要使用代码来实现图。图由多个节点组成。

每个节点都与邻近节点相连,如果表示类似于“你→Bob”这样的关系呢?好在你知道的一种结构让你能够表示这种关系,它就是散列表!

记住,散列表让你能够将键映射到值。在这里,你要将节点映射到其所有邻居。

AMY : python的图实现是很有意思的,很是简洁优雅,但是如果想对图这种数据结构有更清晰的理解我觉得还是得看java或c++的实现更具代表性

表示这种映射关系的Python代码如下。

graph = {}
graph["you"] = ["alice", "bob", "claire"]

注意,“你”被映射到了一个数组,因此graph["you"]是一个数组,其中包含了“你”的所有邻居。

图不过是一系列的节点和边,因此在Python中,只需使用上述代码就可表示一个图。那像下面这样更大的图呢?

表示它的Python代码如下。

graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []

顺便问一句:键—值对的添加顺序重要吗?换言之,如果你这样编写代码:

graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []

而不是这样编写代码:

graph["anuj"] = []
graph["claire"] = ["thom", "jonny"]

对结果有影响吗?

只要回顾一下前一章介绍的内容,你就知道没影响。散列表是无序的,因此添加键—值对的顺序无关紧要。

Anuj、 Peggy、 Thom和Jonny都没有邻居,这是因为虽然有指向他们的箭头,但没有从他们出发指向其他人的箭头。这被称为有向图(directed graph) ,其中的关系是单向的。因此, Anuj是Bob的邻居,但Bob不是Anuj的邻居。 无向图(undirected graph)没有箭头,直接相连的节点互为邻居。例如,下面两个图是等价的。

AMY : 我认为这段描述是不严谨的,一个有向一个无向无论如何也不能称之为等价,意义不同。

results matching ""

    No results matching ""