二阶邻居

时间:2012-06-24 00:38:18

标签: python algorithm graph-theory graph-algorithm

给定一个带有几百万个边的有向图,我试图找到每个节点:

  1. 邻居的邻居列表(让我们称之为two_nei)。

  2. 每个two_nei(称为cn)的常见邻居数量。

  3. 我接近这个问题的方法是:

    1. 创建dict,每个节点作为键,list包含所有邻居作为值(neighbor_dictionary)。

    2. 创建一个dict,每个节点作为密钥,list包含邻居的所有邻居(此节点为two_nei)作为值({{1} })。

    3. 现在我想创建一个second_dictionary(因为不知道该怎么做),图中的每个节点都有一个list。这些字典中的每一个都将包含节点的每个dict作为键,值将是它们具有的常见邻居的数量。

    4. 正如您所看到的,这很容易变得复杂。我相信在python中有一种更简单,更优雅的方法。我是一个数学家,我既没有数据结构也没有算法,但我相信我们可以使用队列来解决这个问题。

      任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:2)

这是一个函数,它返回图中两个节点的共享第二个邻居的数量。它使用networkx作为图表。根据每个节点中的数据量以及图表的密集程度,这可能无效,因为它会在内存中创建可能较大的集合。

def num_shared_second_neighbors(graph, node1, node2):
    """Number of second neighbors shared by node1 and node2 in graph."""
    return len(set(second_neighbors(graph, node1)).intersection(set(second_neighbors(graph, node2))))

def second_neighbors(graph, node):
    """Yield second neighbors of node in graph.
    Neighbors are not not unique!
    """
    for neighbor_list in [graph.neighbors(n) for n in graph.neighbors(node)]:
        for n in neighbor_list:
            yield n

函数second_neighbors是一个生成器,它通过执行简单的图遍历来生成节点的非唯一第二邻居。函数num_shared_second_neighbors只返回两个节点的秒邻居集合交集中的节点数。

答案 1 :(得分:0)

以下是使用 NetworkX 编写的所需函数:

1.邻居的邻居列表

def get_second_neighbors(graph, node) -> list:
    """
    Returns a list of unique second neighbors for a given node in the graph.
    """
    return [second_neighbor 
            for first_neighbor in graph.neighbors(node)
            for second_neighbor in graph.neighbors(first_neighbor) 
            if second_neighbor != node])

2.共享邻居数

def get_num_shared_neighbors(graph, node1, node2) -> int:
    """
    Returns a number of second neighbors shared by node1 and node2 in the graph.
    """
    return len(set.intersection(set(get_second_neighbors(graph, node1)), 
                                set(get_second_neighbors(graph, node2))))

我希望列表理解使它优雅并且易于理解。