简体   繁体   English

Python中的邻接列表和邻接矩阵

[英]Adjacency List and Adjacency Matrix in Python

Hello I understand the concepts of adjacency list and matrix but I am confused as to how to implement them in Python: 你好,我理解邻接列表和矩阵的概念,但我很困惑如何在Python中实现它们:

An algorithm to achieve the following two examples achieve but without knowing the input from the start as they hard code it in their examples: 实现以下两个示例的算法实现但不知道从一开始的输入,因为他们在他们的示例中对其进行硬编码:

For adjacency list: 对于邻接列表:

    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 
   ] 

For adjacency matrix: 对于邻接矩阵:

    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

Again any help will be much appreciated, Thank you! 再次感谢任何帮助,谢谢!

Assuming: 假设:

edges = [('a', 'b'), ('a', 'b'), ('a', 'c')]

Here's some code for the matrix: 这是矩阵的一些代码:

from collections import defaultdict

matrix = defaultdict(int)
for edge in edges:
    matrix[edge] += 1

print matrix['a', 'b']
2

And for the "list": 而对于“清单”:

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}

Setting up your data structures can be pretty simple. 设置数据结构非常简单。 For instance, the adjacency list example can be implemented using a defaultdict like this: 例如,可以使用如下的defaultdict实现邻接列表示例:

from collections import defaultdict

N = defaultdict(dict)

Then when you start getting input, just do N[start][end] = weight for each inputted edge. 然后当你开始输入时,只需对每个输入边做N[start][end] = weight The set of nodes will be a little more tricky to come by, if you have some nodes with no outbound edges (you'll need to union the keys of the inner dictionaries with the outer one to be sure you have them all). 如果你有一些没有出站边的节点(你需要将内部字典的键与外部字典联合起来以确保你拥有它们),那么节点集将会变得更加棘手。 But a lot of algorithms will work correctly even without a complete node list. 但即使没有完整的节点列表,许多算法也能正常工作。

The adjacency matrix is a little more complicated, since you need to know the number of nodes there are in order to set its dimensions correctly. 邻接矩阵稍微复杂一些,因为您需要知道节点的数量才能正确设置其尺寸。 If you know it ahead of time, then its easy: 如果您提前知道,那么很容易:

number_of_nodes = 8
_ = float("inf")

N = [[_]*number_of_nodes for i in number_of_nodes]

If you don't, you'll probably want to scan over the edges you get as input to find the highest numbered node, then use the same code above to make the matrix. 如果不这样做,您可能希望扫描您获得的边缘作为输入以找到编号最高的节点,然后使用上面相同的代码来制作矩阵。 For instance, if your edges are provided as a list of (start, end, weight) 3-tuples, you can use this: 例如,如果您的边缘是作为(start, end, weight) 3元组的列表提供的,您可以使用:

number_of_nodes = max(max(start, end) for start, end, weight in edges)

I hope the below example helps you it has both Initialized Graph as well as user customized 我希望下面的例子可以帮助你同时拥有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): if u not in self.edge: self.addVertex(u) if v not in self.edge: self.addVertex(v) if u not in self.edge[v]: self.edge[v].append(u) if v not in self.edge[u]: self.edge[u].append(v) def addEdge(self,u,v):如果你不在self.edge:self.addVertex(u)如果v不在self.edge中:self.addVertex(v)如果你不在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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM