Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找像Twitter这样的跟随关系的算法_Python_Algorithm - Fatal编程技术网

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