您好我理解邻接列表和矩阵的概念,但我对如何在Python中实现它们感到困惑:
实现以下两个示例的算法实现但是从一开始就不知道输入,因为他们在示例中对它进行了硬编码:
对于邻接列表:
a, b, c, d, e, f, g, h = range(8)
N = [
{b:2, c:1, d:3, e:9, f:4}, # a
{c:4, e:3}, # b
{d:8}, # c
{e:7}, # d
{f:5}, # e
{c:2, g:2, h:2}, # f
{f:1, h:6}, # g
{f:9, g:8} # h
]
对于邻接矩阵:
a, b, c, d, e, f, g, h = range(8)
_ = float('inf')
# a b c d e f g h
W = [[0,2,1,3,9,4,_,_], # a
[_,0,4,_,3,_,_,_], # b
[_,_,0,8,_,_,_,_], # c
[_,_,_,0,7,_,_,_], # d
[_,_,_,_,0,5,_,_], # e
[_,_,2,_,_,0,2,2], # f
[_,_,_,_,_,1,0,6], # g
[_,_,_,_,_,9,8,0]] # h
再次感谢任何帮助,谢谢!
答案 0 :(得分:6)
假设:
edges = [('a', 'b'), ('a', 'b'), ('a', 'c')]
以下是矩阵的一些代码:
from collections import defaultdict
matrix = defaultdict(int)
for edge in edges:
matrix[edge] += 1
print matrix['a', 'b']
2
对于“清单”:
from collections import defaultdict
adj_list = defaultdict(lambda: defaultdict(lambda: 0))
for start, end in edges:
adj_list[start][end] += 1
print adj_list['a']
{'c': 1, 'b': 2}
答案 1 :(得分:1)
设置数据结构非常简单。例如,邻接列表示例可以使用defaultdict
来实现,如下所示:
from collections import defaultdict
N = defaultdict(dict)
然后当您开始输入时,只需为每个输入的边缘执行N[start][end] = weight
。如果你有一些没有出站边的节点(你需要将内部字典的键与外部字典联合起来以确保你拥有它们),那么节点集将会变得更加棘手。但即使没有完整的节点列表,许多算法也能正常工作。
邻接矩阵稍微复杂一些,因为您需要知道节点的数量才能正确设置其尺寸。如果您提前知道,那么很简单:
number_of_nodes = 8
_ = float("inf")
N = [[_]*number_of_nodes for i in number_of_nodes]
如果不这样做,您可能希望扫描您获得的边缘作为输入以找到编号最高的节点,然后使用上面相同的代码来制作矩阵。例如,如果您的边缘是作为(start, end, weight)
3元组的列表提供的,则可以使用:
number_of_nodes = max(max(start, end) for start, end, weight in edges)
答案 2 :(得分:0)
我希望以下示例可以帮助您 它既有Initialized Graph,也有用户自定义
class Graph:
"""
Read the Intialized Graph and Create a Adjacency list out of it
There could be cases where in the initialized graph <map> link
issues are not maintained
for example node 2 to 1 link
2->1
there needs to be a link then since undirected Graph
1->2
"""
def __init__(self,Graph_init):
self.edge={}
for keys,values in Graph_init.items():
for value in values:
self.addEdge(keys,value);
"""
Add a vertex to graph map
structure is
int => int list
"""
def addVertex(self,v):
if v not in self.edge:
self.edge[v]=[]
"""
Add Edge from both vertex to each other
Make sure the nodes are present
“”“
def addEdge(self,u,v):
如果你不在自我中:
self.addVertex(U)
如果v不在self.edge中:
self.addVertex(五)
如果你不在self.edge [v]:
self.edge [V] .append(u)的
如果v不在self.edge [u]:
self.edge [U] .append(v)的
def isEdge(self,u,v):
if u not in self.edge:
return False
if v not in self.edge:
return False
return u in self.edge[v]
def display(self):
for keys,values in self.edge.items():
print(keys,":=>",values)
"""A initalized Graph (not in form of adjaceny list"""
Graph_init = {1:[2,3,5],
2:[1,4],
3:[1,6]};
"""Default constrcutor takes care of making the initialzed map to adjaceny
list"""
g=Graph(Graph_init)
g.addVertex(1)
g.addVertex(2)
g.addVertex(3)
g.addEdge(1,2)
g.addEdge(3,2)
g.display();