我有一个包含>10,000个整数项的列表。这些项的值可能非常高,高达10^27。现在我想创建所有项的配对并计算它们的和。然后我想寻找具有相同和的不同配对。
例如:
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
的键是int类型,最大可达到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)]}
编辑:我想添加一些背景信息,如Simon Stelling所要求的。
目标是寻找形式类比,例如
lays : laid :: says : said
在像单词列表这样的列表中
[ lays, lay, laid, says, said, foo, bar ... ]
我已经有一个函数
analogy(a,b,c,d)
,如果a:b::c:d
则返回True
。然而,我需要检查从列表中创建的所有可能的四元组,这将是大约O((n^4)/2)的复杂度。作为预处理器,我想使用字符计数属性。它表示每个字符在(a,d)和(b,c)中具有相同的计数。例如,在“layssaid”中我们有2个a,而在“laidsays”中也是如此。
因此,目前的想法是:
- 为每个单词创建一个“字符计数向量”,并将其表示为整数(列表中的项
l
) - 创建
pairs
中的所有配对,并查看是否存在“配对簇”,即特定字符计数向量总和的多个配对。
O(n^2)
的。 - blubb