【问题标题】:homework: never ending loop 5**200000作业:永无止境的循环 5**200000
【发布时间】:2013-11-11 23:12:56
【问题描述】:

我有一个家庭作业:在数字 5**200,000 中找到 50,000 个连续数字的最大和。 我知道如果我对这个数字进行 for 循环,它不会在可行的时间内结束。 我试图把这个数字放在一个列表中并遍历列表,但我不明白它是如何工作的?为什么它不像第一种情况那样表现?是什么让它更快? 这是我的代码:

def maxdigits(number,digits):
    s=str(number) #conversting the number to a string
    l = [int(char) for char in s]
    maximum = current = sum(l[:digits])
    for i in range(0,len(l)-digits):
        current = current-l[i]+l[i+digits]
        if current > maximum: maximum = current
    return maximum    

【问题讨论】:

  • 定义“数字 5**200,000 中 50,000 个连续数字的最大和”。这与数字之和有何不同?您是在谈论任何 50,000 个连续数字吗?无论如何,您的问题是关于数学洞察力,而不是代码。
  • 是的,我将 5**200000 转换为字符串
  • 代码在我的机器上运行良好。
  • 你在做Maximum subarray problem吗?
  • 我不清楚你在问什么。我想我理解这个任务,你的代码看起来可能是正确的或非常接近。你说这比什么更快?您能否提供您所说的较慢的代码,因为您对它的描述对我来说不够清楚。

标签: python performance loops for-loop python-3.x


【解决方案1】:

我想你是在问为什么对数字 5**200000 的数字的循环会很快完成,而在 0(5**200000)-1 范围内的所有数字循环需要很长时间。

我认为这对您来说并不明显的唯一原因是因为这些数字很大,很难写下来。再想一想。循环遍历1000000 的七位数字或从0999999 的百万个数字会更快吗? 5**200000 中有 139795 数字。做一个简单的循环139795 次的工作量并不大。做一个简单的循环5**200000 次是一项庞大的工作。这是一个荒谬的数字。如果宇宙中的每个原子都是一台计算机,并且每个原子都在宇宙的生命周期内运行,我怀疑他们会成功地做任何事情5**200000 次。

【讨论】:

    【解决方案2】:

    代码运行得更快,因为不是遍历列表

    [ 0, 1, ..., 5 ** 200000 ]
    

    你正在迭代

    [ 0, 1, ..., 139 795 - 50000 ]
    

    比第一个列表小几个数量级。

    而你计算那个数字的位数的方法是:

    200000 * log5 + 1
    

    【讨论】:

      猜你喜欢
      • 2016-06-04
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-14
      • 2020-03-14
      相关资源
      最近更新 更多