【问题标题】:Can someone help me in optimising the below python code, I am getting timeout exception for some of the test cases有人可以帮我优化下面的python代码吗,我在某些测试用例中遇到超时异常
【发布时间】:2022-01-21 13:09:32
【问题描述】:

谁能帮我优化下面的代码。

power = [2,3,2,1]

noElement = len(power)
result = 0
for i in range(noElement):
    sum = 0
    minEleme = float('inf')
    for j in range(i, noElement):
        minEleme = min(minEleme,power[j])
        sum+=power[j]
        result += (minEleme*sum)%1000000007
        print("min : ",minEleme,"sum : ",sum,"result : " ,result)
print(result)

问题: 一家公司有 n 台服务器。第 i 个服务器的功率是 power[i]。连续服务器组的功率 [l,r] 可以计算为

formula

找到所有可能的连续服务器组的幂的总和。根据输入值,答案可能很大,因此返回答案模 1000000007

1

1

示例: 幂=[2,3,2,1]

Power[0,0] => min([2]) * sum([2]) => 2 * 2 = 4.
Power[0,1] => min([2,3]) * sum([2,3]) => 2 * (2+3) = 10
Power[0,2] = 14
Power[0,3] = 8
Power[1,2] = 10
Power[1,3] = 6
Power[2,2] = 4
Power[2,3] = 3
Power[3,3] = 1

幂和 = 69。 返回 69%1000000007。

【问题讨论】:

  • 隐藏像 sum 这样的内置函数是不明智的。除此之外,%1000000007 发生了什么 - 代码的目的到底是什么?如果你不知道它应该做什么,很难优化它。另外,您说您“某些测试用例出现超时异常”,您能否提供这种情况的示例和确切的错误消息?
  • 感谢格里斯玛的回复。对不起,我没有测试用例数据,它被锁定了。我已经更新了问题,如果您还需要任何信息,请告诉我。

标签: python optimization


【解决方案1】:

鉴于作为问题的一部分给出的公式(在图片中),答案不是简单的:

def group_power(power, l, r):
    return min(power[l:r+1]) * sum(power[l:r+1])


answer = group_power(power=[2,3,2,1], l=1, r=3)
print(answer)

从您共享的代码中不清楚lr 的位置,您只是共享了一小部分power。我看不出这会如何发生超时。

从您的 cmets 看来,您需要每个可能范围的组幂总和,然后您希望结果以某个值为模:

def group_power_calc(power, modulo):
    return sum(
        min(power[l:r+1]) * sum(power[l:r+1])
        for l in range(len(power))
        for r in range(l, len(power))
    ) % modulo


answer = group_power_calc(power=[2, 3, 2, 1], modulo=1000000007)
print(answer)

结果:

69

【讨论】:

  • 问题是找出所有可能的连续服务器功率的总和。那条 power = [2,3,2,1] 线只是我计算的一个例子。这个问题是在一个隐藏测试用例的编码平台上提出的。如您所见,功率数组的值范围是 1 到 1000000000,组功率的总和可能会超过限制,因此他们要求我取模 1000000007。
  • 从您分享的信息以及您的代码在做什么,还不清楚需要什么。我建议您在问题中添加有关(或指向)实际作业的信息。
  • 我为造成的混乱道歉。以下是该问题的示例计算。示例:power=[2,3,2,1] Power[0,0] = min([2]) * sum([2]) = 2 * 2 = 4. Power[0,1] = min([ 2,3]) * sum([2,3]) = 2 * (2+3) = 10 幂[0,2] = 14 幂[0,3] = 8 幂[1,2] = 10 幂[ 1,3] = 6 幂[2,2] = 4 幂[2,3] = 3 幂[3,3] = 1 幂之和 = 69。返回 69%1000000007。
  • 模值似乎仍然有些随意,但我添加了一个完全符合您描述的函数 - 我怀疑这会导致性能问题。
  • 感谢您的代码,但很抱歉我无法再访问该问题。我想知道为什么我的代码会超时。最初,我用 2 个 for 循环以相同的方式完成它并计算子数组的最小值和总和值,但我无法摆脱一些测试用例。我相信在我的代码中从 min() 计算最小值更好,因为我不是在子数组上计算它,而是在前一个 min(即之前所有元素的 min)和新添加的整数的 2 个数字上进行计算,同样适用于 sum()
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多