优化嵌套for循环的运行时间

时间:2017-09-28 20:03:01

标签: python algorithm optimization data-structures

我刚刚开始进行竞争性编程,在针对某些问题编写解决方案后,我发现 RUNTIME超出错误。

max(| a [i] - a [j] | + | i - j |)

a 是元素列表而 i j 是索引我需要获取 max()上述表达。

这是一个简短但完整的代码段。

t = int(input()) # Number of test cases
for i in range(t):
    n = int(input()) #size of list
    a = list(map(int, str(input()).split())) # getting space separated input
    res = []
    for s in range(n): # These two loops are increasing the run-time
        for d in range(n):
            res.append(abs(a[s] - a[d]) + abs(s - d))
    print(max(res))

Input File此链接可能会过期(希望它有效)

  • 1·; = T< = 100
  • 1·; = N&LT = 10 ^ 5
  • 0℃; = A [1] - = 10 ^ 5

C语言的排行榜运行时间为5秒 Python的运行时间为35秒,而此代码需要 80秒

在线评判如此独立于机器。 numpy不可用

保持简单我是python的新手。

感谢阅读。

2 个答案:

答案 0 :(得分:1)

"竞争性节目"不是通过使用不同类型的循环来节省几毫秒;关于如何处理问题,以及然后有效地实施解决方案。

然而,跳出来的一件事是你浪费时间建立一个列表只扫描它以找到最大值。您的双循环可以转换为以下内容(忽略其他可能的改进):

print(max(abs(a[s] - a[d]) + abs(s - d) for s in range(n) for d in range(n)))

但那是小鱼苗。首先担心你的算法,然后转向甚至明显的时间浪费。正如@Brett向您展示的那样,您可以将比较次数减少一半,但我会首先研究问题并问自己:我是否真的需要计算此数量n^2次,甚至0.5*n^2次?这就是你如何缩短时间,而不是缩短毫秒。

答案 1 :(得分:1)

对于给定的j<=i|a[i]-a[j]|+|i-j| = max(a[i]-a[j]+i-j, a[j]-a[i]+i-j)

因此对于给定的i,最大化j<=i的{​​{1}}的值是最大化|a[i]-a[j]|+|i-j|的{​​{1}}或j最小化a[j]-j

这两个值都可以在您沿着数组运行时计算,给出一个简单的O(n)算法:

j

这是针对一个天真但明显正确的算法进行的一些简单测试:

a[j]+j

在大小为10 ^ 5的数组上运行def maxdiff(xs): mp = mn = xs[0] best = 0 for i, x in enumerate(xs): mp = max(mp, x-i) mn = min(mn, x+i) best = max(best, x+i-mn, -x+i+mp) return best 只需要几分之一秒,这明显优于您报告的排行榜得分。