对Python函数的最佳/最差情况时间的答案感到困惑

时间:2014-07-17 05:34:39

标签: python performance big-o complexity-theory time-complexity

这是edx的课程计算机科学和使用Python编程的一个简短问题。

def program1(x):
    total = 0
    for i in range(1000):
        total += i

    while x > 0:
        x -= 1
        total += x

    return total

问题:在最佳情况下运行程序1需要多少步骤?用n,输入x的大小来表达你的答案

回答:最佳案例:3003和最坏情况:5n + 3003

我对答案3003感到困惑,因为根据我的说法,问题的最佳情况是如果x = -1并且其他语句执行时会有一定的时间.hence 声明

total =0   // takes a constant amount of time 1

for i in range(1000):
    total += i        // takes 1000*1 amount of time


return total   // takes constant of time 1 

因此答案应该是1000 + 2 = 1002

任何有关正确解释的帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,我认为理解答案的关键是行for i in range(1000):正在做两个事情[ ed:请参阅下面的更新]每次通过你忽略计数的循环:首先,它是递增变量i,第二,它是根据最大值(1000)检查它以查看循环是否完成。因此,每次遍历循环应该算作3次操作。

最后,即使跳过循环,仍然需要一个操作来决定这样做,即在行x中检查0while x > 0:

这是在最好的情况下如何计算:

def program1(x):
    total = 0                  // counts as 1
    for i in range(1000):      // counts as 2 * 1000
        total += i             // counts as 1 * 1000

    while x > 0:               // counts as 1 + N  (note: so when x <= 0, still counts as 1)
        x -= 1
        total += x

    return total               // counts as 1

......总计3003。


更新:

鉴于提供给您的最差案例答案是5n + 3003,我必须修改我的答案。

这意味着while循环中的-=+=操作必须被计为两个单独的操作(增量或减量和赋值)。如果是这样,则for循环中的+=操作也必须计为2个操作。如果是这种情况,那么使数字与提供的答案一致的唯一方法是会计是这样的:

def program1(x):
    total = 0                  // counts as 1
    for i in range(1000):      // counts as 1 * 1000
        total += i             // counts as 2 * 1000

    while x > 0:               // counts as 1 + N
        x -= 1                 // counts as 2 * N
        total += x             // counts as 2 * N

    return total               // counts as 1

我个人不同意将+=-=计算为抽象意义上的两件事,因为我知道它们可以在汇编中作为单个操作完成(假设所有值都在寄存器中) ),但在Python 中它们实际上是两个操作。 (有关详细信息,请参阅以下链接中的第4个答案。)

要接受此会计,您还必须接受每次循环时行for i in range(1000):仅计为一个操作。一旦意识到我错了,我就找到了这个答案here,这有助于理解这一点。基本上,这是因为循环的上限和迭代元素本身是固定的。