Python 查找像Twitter这样的跟随关系的算法
我有一张这样的清单Python 查找像Twitter这样的跟随关系的算法,python,algorithm,Python,Algorithm,我有一张这样的清单 [(1, 2), (2, 3), (3, 2), (3, 4), (4, 1), (4, 3)] 这意味着用户1跟随用户2,依此类推 目标是找到一个类似的列表 [(2, 3), (3,4)] 这意味着用户2跟随用户3,反之亦然 到目前为止,我找到了一种我认为还不够快的方法(用Python编写) 有人能给我看一些更快的算法吗?你的算法是按线性时间运行的。这是这个问题最快的渐近运行时间,因为任何解决它的算法都必须查看所有的输入。有可能得到一个恒定的加速因子;例如,此代码: s
[(1, 2), (2, 3), (3, 2), (3, 4), (4, 1), (4, 3)]
这意味着用户1跟随用户2,依此类推
目标是找到一个类似的列表
[(2, 3), (3,4)]
这意味着用户2跟随用户3,反之亦然
到目前为止,我找到了一种我认为还不够快的方法(用Python编写)
有人能给我看一些更快的算法吗?你的算法是按线性时间运行的。这是这个问题最快的渐近运行时间,因为任何解决它的算法都必须查看所有的输入。有可能得到一个恒定的加速因子;例如,此代码:
set_l = set(l)
mutual_followers = [x for x in set_l if x[::-1] in set_l]
当我计时时,运行速度比您的快一倍多一点,但是如果您需要重大改进,您可能需要考虑改进程序的其他方面
----运行时----
[(2,3)、(3,4)]
如何表示用户3跟随用户2?@user2357112:这是结果;由于主列表同时包含(2,3)
和(3,2)
,因此得到的结果是(2,3)
;与(3,4)
相同,噢,(3,4)
是一个单独的结果。描述似乎暗示(2,3)
意味着2跟在3后面,(3,4)
意味着3跟在2后面。此算法在线性时间内运行。有可能获得一个合适的常数因子加速比,但如果您需要任何戏剧性的东西,可能需要对代码的其他方面进行修改。谢谢您的回答。您的计时结果比我的更倾向于基于集合的算法。看起来你的输入比我计时的要小得多。我想知道是什么造成了这种效果。我用IPython+CPython来计时,我不知道为什么它快六倍而不是两倍。。。
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