Python:在2个列表中找到快速匹配(碰撞)

时间:2014-12-23 12:34:22

标签: python performance list match

我在python中遇到了效率问题。 几天来,我现在试图找到并测试不同的实现,但是不能让它足够快地工作。

任务:我有两个列表arr和arr2,其中1000000个条目为b''(使用键“00000000”到“00999999”进行加密和解密) 并且知道必须在这两者中找到匹配(DES2在中间相遇)。因此

if arr[x] == arr2[y]:
    return x, y

我认为我的解决方案可行,但速度太慢,还不够:

def g(x):
    for k in range(0, 1000000):
        if (arr[x] == arr2[k]):
            return k, x
    return 0

keypair = 0

for k in range(0, 1000000):
    if keypair == 0:
        keypair = g(k)
    else:
        break

问题是,密钥对应该在不到40秒的时间内找到,但是例如对于1000000个条目中的1000个,此示例需要1分钟。

现在某种程度上必须提高效率。我尝试了其他一些解决方案,这些解决方案可以提高效率,例如数组的map和numpys解决方案,但速度没有得到任何真正的改善。

您知道任何智能解决方案吗?

1 个答案:

答案 0 :(得分:0)

我不确定您是否只对存在感兴趣,或者您需要列表中的索引。该解决方案是关于索引案例。如果您只是需要检查存在,请使用g作为set而不是字典,并检查kgk的{​​{1}}是否arr2 }。

如果空间不是问题,请尝试使用字典:

g = {k:i for i,k in enumerate(arr)}

keypair = None
for i,k in enumerate(arr2):
    if k in g:
        keypair = (i, g[k])
        break;

哈希表在查找操作上摊销O(1)。

无论如何写cython并不难(即使使用原生类型),但如果你不改变算法并仍然使用O(n ^ 2)方法,你将失败你的目标。

该方法是O(n),但使用大量内存并且可能是高常量。问题的维度(n=1000000)应该使它成为最好的,但可能会对数组值进行排序,然后考虑到它们的排序可以更快,即使是O(nlog(n))方法。如果第一次失败,您可以尝试排序数据。