我有一个像
这样的清单[(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]
有人能给我看一些更快的算法吗?
答案 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