Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查图是否为无向图?_Python_Python 3.x_Dictionary_Graph - Fatal编程技术网

Python 如何检查图是否为无向图?

Python 如何检查图是否为无向图?,python,python-3.x,dictionary,graph,Python,Python 3.x,Dictionary,Graph,目前,我正在创建一个函数来检查图形是否为非定向图形。 我的图表是这样存储的。这是一个由3个节点组成的无向图,1、2、3 graph = {1: {2:{...}, 3:{...}}, 2: {1:{...}, 3:{...}}, 3: {1:{...}, 2:{...}}} {…}表示每个节点中连接的字典交替层。它是无限重复的,因为它彼此嵌套 有关图形的更多详细信息: 键指的是节点,它的值指的是dict,节点连接到键 示例:具有无向边的两个节点(1,2):graph={1:{2:{1:{…}}

目前,我正在创建一个函数来检查图形是否为非定向图形。 我的图表是这样存储的。这是一个由3个节点组成的无向图,1、2、3

graph = {1: {2:{...}, 3:{...}}, 2: {1:{...}, 3:{...}}, 3: {1:{...}, 2:{...}}}
{…}表示每个节点中连接的字典交替层。它是无限重复的,因为它彼此嵌套

有关图形的更多详细信息:

  • 键指的是节点,它的值指的是dict,节点连接到键
  • 示例:具有无向边的两个节点(1,2):
    graph={1:{2:{1:{…}}},2:{1:{2:{…}}}}
  • 示例2:有向边从1到2的两个节点(1,2):
    graph={1:{2:{}},2:{}

  • 我目前判断图是否无向的方法是检查图中的边数是否等于(n*(n-1))/2(n表示节点数),但这无法区分15条有向边和15条无向边,那么还有什么其他方法可以确认我的图是无向的呢?

    首先,我认为你滥用了术语,把两个方向都有边的图称为“无向图”。在真实无向图中,没有边方向的概念,这通常意味着在计算机程序中,在图的表示中不需要冗余的方向信息。你有一个有向图,你想看看它是否可以用一个无向图来表示,即使你还没有这样做

    我不确定有没有比检查图中的每条边来查看反向边是否也存在更简单的方法。这对于图形结构来说非常简单,只需在垂直方向上循环,并检查每个输出边是否有返回边:

    def undirected_compatible(graph):
        for src, edges in graph.items():          # edges is dict of outgoing edges from src
            for dst, dst_edges in edges.items():  # dst_edges is dict of outgoing edges from dst
                if src not in dst_edges:
                    return False
        return True
    
    我注意到,描述像您这样的图的一种更典型的方式是省略嵌套字典,只给出边的目的地列表。完全连接的3节点图应为:

    {1: [2, 3], 2: [1, 3], 3: [1, 2]}
    
    def undirected_compatible(graph):
        for src, edges in graph.items():
            for dst in edges:
                if src not in graph[dst]:
                    return False
        return True
    
    您可以从这个图中获得与当前图相同的信息,只需额外的间接操作即可在顶级图dict中查找目标节点,而不是让它成为边缘容器中相应键的值。对于这种更为传统的结构,我的上述功能的一个版本是:

    {1: [2, 3], 2: [1, 3], 3: [1, 2]}
    
    def undirected_compatible(graph):
        for src, edges in graph.items():
            for dst in edges:
                if src not in graph[dst]:
                    return False
        return True
    

    not in
    测试可能会使大型图的搜索速度变慢,因为在列表中搜索项的渐进效率低于检查键是否在字典中。如果您需要更高的性能,可以使用集合而不是列表来加快成员资格测试。

    您能提供一个示例字典吗?此外,是否允许使用自边?@BalajiAmbresh不,我忽略自边是为了让事情变得更简单,您能否详细说明示例字典的含义。您能否提供一个
    图形的示例,并解释键/值代表什么?@BalajiAmbresh我已经更新了关于我的图形的更多细节的问题,希望足够了。一般来说,图是否有向是一个结构性的决定。也就是说,它是在实现任何东西或在代码中表示图形之前确定的。如果您需要检查图形的数据以了解它是否是有向的,那么“无向”的意思可能与正常的意思不同。你的定义是每一条边A->B都有一条边B->A吗?因为正是这些不同事物的想法暗示了一个有向图。