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同意,但我也向他建议了一种基于二进制搜索
的解决方案。哦?你打算怎么做呢?这很公平,但你确实需要构建一个完全独立的哈希表副本,所以需要考虑内存成本。哦?你打算怎么做呢?这很公平,但你确实需要构建一个完全独立的哈希表副本,所以需要考虑内存开销。