寻找像Twitter这样的关系的算法

时间:2014-03-04 01:54:15

标签: python algorithm

我有一个像

这样的清单
[(1, 2), (2, 3), (3, 2), (3, 4), (4, 1), (4, 3)]

表示用户1关注用户2,依此类推......

目标是找到像

这样的列表
[(2, 3), (3,4)]

表示用户2跟随用户3,反之亦然。

到目前为止,我提出了一种我认为仍然不够快的方法(用Python编写)

[x for x, y in collections.Counter([tuple(sorted(x)) for x in l]).iteritems() if y > 1]

有人能给我看一些更快的算法吗?

1 个答案:

答案 0 :(得分:2)

您的算法以线性时间运行。对于这个问题,这是最快的渐近运行时,因为任何解决它的算法都必须查看所有输入。可以获得恒定的因子加速;例如,这段代码:

set_l = set(l)
mutual_followers = [x for x in set_l if x[::-1] in set_l]

运行速度比我的时间快两倍,但是如果你需要重大改进,你可能需要考虑改进程序的其他方面。

----运行时间----

In [125]: %%timeit
set_l = set(l);[x for x in set_l if x[::-1] in set_l]
   .....: 
100000 loops, best of 3: 6.26 µs per loop

In [126]: %%timeit
   .....: [x for x, y in collections.Counter([tuple(sorted(x)) for x in l]).iteritems() if y > 1]
   .....: 
10000 loops, best of 3: 39.3 µs per loop