python - 寻找最近连接的图算法

标签 python algorithm data-structures graph-algorithm

我有一个数据集,记录员工每个轮类的工作情况。对于每位员工,我想找到与他们共事最多的同事。

该表大约有 2.5 亿行,有 5000 万个类次和 10 万个唯一员工。举个例子,表格开头如下:

+----------+--------+
| Shift ID | Emp ID |  
+----------+--------+
|        1 | A      |  
|        1 | B      |  
|        2 | A      |
|        2 | C      | 
|        3 | A      |  
|        3 | C      |
+----------+--------+

员工 A 与员工 B 合作过一次,但与员工 C 合作过两次。因此,员工 A 最常来的同事是员工 C。

什么算法可以找到每个员工最常联系的同事?天真地试图找到成对共同移位的数量太慢了:

solution = {}
for e in employees:
    maxCommonShifts = 0
    for c in employees:
        if e != c:
            commonTrips = len(e.trips ∩ c.trips)
            if commonTrips > maxCommonShifts:
                maxCommonShifts = commonTrips
                solution[e] = c

我相信图算法将是这里的解决方案。具体来说,这个问题似乎类似于 FB 试图计算一个人最亲密的 friend ,即他们拥有最多的共同 friend 。从图中来看,每个类次有一个节点,每个员工有一个节点。每个员工节点都连接到他们工作过的每个轮类节点。

最佳答案

2.5 亿行加上 50M 类次,平均每个类次有 5 行,因此为每个类次创建一组记录,给出该类次中的员工对,将使数据大小增加超过 5 倍,即很贵但也不算太糟糕。因此,您的第一个类次,看到 1A 和 1B,将创建记录 AB 和 BA 对的两条记录。如果您有 1A、1B 和 1C,那么您将创建记录 AB、AC、BA、BC、CA、CB。

通过这种格式的输入,您可以使用小程序和排序实用程序(unix 和 windows 都有排序程序)或在数据库中使用 SQL 来执行您想要的操作。对第一个成员生成的大约 2000M 对的列表进行排序,然后对第二个成员生成的列表进行排序。然后按顺序处理这个列表。您将看到按顺序排序的记录,例如 AB AB AB AC AC AD AD AD AD AD AE AE...,您可以挑选出相同记录的运行并对它们进行计数,跟踪每个第一个元素的最长此类运行当你遇到它时就一对。

关于python - 寻找最近连接的图算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60160942/

相关文章:

arrays - 为什么在有界队列中使用数组作为数据结构是个坏主意?

algorithm - 怎样用最简单的方法求某次幂的个位数

Java 优先级队列接口(interface)实现

java - 扩展 TreeMap 以仅采用 Integer -> Integer 映射?

python - 从 python 中的 freezeset 访问项目

python 爬虫。解析并执行ajax

algorithm - 图算法?

arrays - 数数1s 和 0s 没有比较

python - 何时以及如何使用 Tornado?什么时候没用?

javascript - django View - 502 错误网关