Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 程序速度/不必要的重复计数_Python_Performance_Cpu Speed - Fatal编程技术网

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

Python 程序速度/不必要的重复计数,python,performance,cpu-speed,Python,Performance,Cpu Speed,我试图在一个有特定差异的数字列表中找到对的数量。比如说,用清单 1 2 3 4 5 差分目标'2',我想打印数字'3',因为这个序列中有3对差分为'2'。然而,我的代码速度非常慢——它会加倍计算所有对,因此我最终需要将我的解除以2才能得到答案。有没有办法在不重复计算的情况下完成同样的任务?我很欣赏你的见解。谢谢代码印在下面 import sys def main(): solutions=0 pairs=[] for i in

我试图在一个有特定差异的数字列表中找到对的数量。比如说,用清单

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()

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

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

首先对数组进行排序,然后对列表中需要查找的每个数字(
num
)进行排序。我想最快的方法是通过


因此,使用二进制搜索,您将得到一个
O(n log(n))
解决方案。

首先对数组进行排序,然后对列表中需要查找的每个数字(
num
)进行排序。我想最快的方法是通过


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

对于
a
中的每个元素
i
,您需要检查
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在a_集
,它是一个
bool
,计算结果为
1
,作为
int
。这相当于
和(如果I-diff在a_集中,则I在a_集中为1)
]


更新:我突然想到,我假设这些数字是唯一的。如果不是,那没关系,我们可以使用一个
集合计数器来保存多重性信息。

对于
a
中的每个元素
i
,您要检查
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在a_集
,它是一个
bool
,计算结果为
1
,作为
int
。这相当于
和(如果I-diff在a_集中,则I在a_集中为1)
]


更新:我突然想到,我假设这些数字是唯一的。如果没有,那没关系,我们可以使用一个
集合计数器来保存多重性信息。

列表是否总是被排序?列表是否总是被排序?这仍然是O(n**2)。如果你使用
集合
而不是
列表
,速度会快得多。@Tim同意,但我也建议他使用基于
二进制搜索
的解决方案。这仍然是O(n**2)。如果你使用
集合
而不是
列表
,速度会快得多。@Tim同意,但我也向他建议了一种基于
二进制搜索
的解决方案。哦?你打算怎么做呢?这很公平,但你确实需要构建一个完全独立的哈希表副本,所以需要考虑内存成本。哦?你打算怎么做呢?这很公平,但你确实需要构建一个完全独立的哈希表副本,所以需要考虑内存开销。