我有一个> 10.000 int类型的项目列表。这些物品的价值可能非常高,高达10^27。现在我想创建所有项目对并计算它们的总和。然后我想用相同的总和查找不同的对。Python:大int键快字典
例如:
l[0] = 4
l[1] = 3
l[2] = 6
l[3] = 1
...
pairs[10] = [(0,2)] # 10 is the sum of the values of l[0] and l[2]
pairs[7] = [(0,1), (2,3)] # 7 is the sum of the values of l[0] and l[1] or l[2] and l[3]
pairs[5] = [(0,3)]
pairs[9] = [(1,2)]
...
的pairs[7]
的内容是什么,我期待的。它给了我两个相同的价值总和。
我已经实现它如下 - 我不知道它可以做得更快。目前,对于10.000个物品,在快速机器上需要> 6个小时。 (正如我所说,l
和值的pairs
所以键是整数可达10^27)
l = [4,3,6,1]
pairs = {}
for i in range(len(l ) ):
for j in range(i+1, len(l)):
s = l[i] + l[j]
if not s in pairs:
pairs[s] = []
pairs[s].append((i,j))
# pairs = {9: [(1, 2)], 10: [(0, 2)], 4: [(1, 3)], 5: [(0, 3)], 7: [(0, 1), (2, 3)]}
编辑:我想添加一些背景,要求由西蒙·Stelling 。
的目标是要找到正规的类比象
lays : laid :: says : said
单词列表内的类似
[ lays, lay, laid, says, said, foo, bar ... ]
我已经有一个函数analogy(a,b,c,d)
给True
如果a : b :: c : d
。但是,我需要检查从列表创建的所有可能的四元组,这将是O((n^4)/ 2)左右的复杂度。
作为一个预过滤器,我想使用char-count属性。它说每个char在(a,d)和(b,c)中都有相同的计数。例如,在“layssaid”我们有2级的,所以我们在“laidsays”
做这样的想法到现在为止是
- 的每一个字,以创建一个“字符计数矢量”和代表它作为一个整数(列表中的项目
l
) - 在
pairs
中创建所有配对并查看是否存在“配对簇”,即对于特定的char计数向量和有多于一对。
它的工作原理,它只是缓慢。复杂度下降到O((n^2)/ 2)左右,但这仍然很多,特别是字典查找和插入操作经常完成。
的问题是不是整数的大小,这是事实,你有过这是在'o所有条目的双重嵌套循环(N^2)' – blubb 2011-05-06 12:15:16
你真的等了6个小时,直到完成了吗?不过我建议看看PEP8 :) – Ant 2011-05-06 12:25:43
...范围还会返回一个完整列表,其中所有项目都展开,请使用xrange代替 – 2011-05-06 12:25:44