对于给定的问题,以下两个代码的执行时间为什么会有如此大的差异?

时间:2019-10-07 05:54:36

标签: python

问题: 系统会为您提供n个数字和q个查询的数组。对于每个查询,您必须将子数组的期望值(均值)的底数从L打印到R。

输入:

第一行包含两个整数N和Q,分别表示数组元素的数量和查询的数量。

下一行包含N个由空格分隔的整数,它们表示数组元素。

接下来的Q行包含两个整数L和R(数组的索引)。

输出:

打印一个表示答案的整数。

1 <= N,Q,L,R <= 10 ^ 6

1 <=数组元素<= 10 ^ 9

样本输入:

5 3
1 2 3 4 5
1 3
2 4
2 5

样本输出:

2 
3
3

CODE1:

n,q=map(int, input().split())

arr=list(map(int,input().split()))
for i in range(0,q):
    s=0
    b=input().split()
    L=int(b[0])-1
    R=int(b[1])-1
    d=R-L+1
    for j in range(L,R+1):
        s=s+arr[j]
    print(s//d)    

代码1的执行时间为8.02秒。

CODE2:

m, n = map(int, input().split())
a = list(map(int, input().split()))
s = []
s1 = 0
for i in range(m):
    s1 += a[i]
    s.append(s1)
for i in range(n):
    x, y = map(int, input().split())
    if x == 1:
        print((s[y-1])//(y-x+1))
    else:
        print((s[y-1] - s[x-2])//(y-x+1))

,而CODE2仅需3.1秒即可执行。为什么呢? 请详细说明。

problem link

2 个答案:

答案 0 :(得分:1)

这是因为在代码1中:您正在计算l和r之间的每个值的平均值。 通过对k个查询执行此操作,您每次都会计算总和,然后求平均值。这样您的复杂度就变成了(k个查询*求和/均值的复杂度)

在代码2中:

您要将连续的和保存在O(n)数组中

,当计算k个查询的平均值时,您要调用求和值直到该求和数组中的l和r元素,然后求和并计算平均值,因此每个查询的o(1)。这为您节省了时间。

答案 1 :(得分:0)

时间复杂度非常重要。 CODE1有两个嵌套的for循环,所以它的时间复杂度是O(n ^ 2),而CODE2有两个for循环,但是顺序上,所以时间复杂度是O(n)