程序速度/不必要的重复计算

时间:2013-01-12 05:46:29

标签: python performance cpu-speed

我试图找到具有特定差异的数字列表中的对数。用列表说

1 2 3 4 5

和差异目标'2',我想打印数字'3',因为这个序列中有3对,差异为'2'。但是,我的代码速度非常慢 - 它会对所有对进行重复计算,因此我最终需要将解决方案除以2才能得到答案。有没有办法在不重复计算的情况下完成同样的任务?我很欣赏您可能拥有的任何见解。谢谢!代码打印在

下面
    import sys


    def main():
        solutions=0
        pairs=[]
        for i in xrange(len(numbers)):
            for j in xrange(len(numbers)):
                if i!=j:
                    pairs.append([numbers[i], numbers[j]])

        for pair in pairs:
            if abs(pair[0]-pair[1])==k:
                solutions+=1
            else:
                continue
        return solutions/2



    if __name__ == '__main__':
        lines=sys.stdin.readlines()
        n,k=map(int, lines[0].strip().split())
        numbers=map(int, lines[1].strip().split())
        print main()

3 个答案:

答案 0 :(得分:3)

对于i中的每个元素a,您需要检查i-diff是否也在a中。对于~O(1)成员资格测试,我们可以使用一组。因此:

>>> a = [1,2,3,4,5]
>>> diff = 2
>>> a_set = set(a)
>>> sum(i-diff in a_set for i in a_set)
3

是O(len(a))。

[请注意,我使用了i-diff in a_set bool作为1评估为int的事实。这相当于sum(1 for i in a_set if i-diff in a_set)。]

更新:我发现我认为这些数字是唯一的。如果他们不是,那没关系,我们可以使用collections.Counter来保留多重性信息。

答案 1 :(得分:0)

如果对数组进行排序,只需通过遍历数组而不是进行O(n ^ 2)搜索就可以找到所有对。重复计算的原因是你使用abs所以它不仅发现(1,3)而且发现(3,1)。

答案 2 :(得分:0)

首先对数组进行排序,然后对列表中的每个数字(num)进行排序,您需要查找num-2。我想快速的方法是binary search

因此,通过二进制搜索,您将获得O(n log(n))解决方案。