【问题标题】:Calculating time complexity of Python while loop计算Python while循环的时间复杂度
【发布时间】:2022-09-22 23:57:13
【问题描述】:

我一直在研究 DSA 问题,并且一直在尝试计算我的解决方案的时间和空间复杂度。我觉得大多数解决方案都可以,但是有很多解决方案,比如下面的解决方案,让我很难过。

    while paymentTotal <= k:
        temp = heapq.heappop(heap)
        if paymentTotal + temp > k:
            break
        paymentTotal += temp
        toyCount += 1

在这种情况下,循环似乎可以分解成这样(堆是一个包含随机整数的 minHeap。k 也是一个随机整数):

k = n
p = 0
while p <= k:
     t = heap.heapqpop(heap)
     p += t

所以这意味着循环在 p+t <= k 时运行,但是因为 t 不会以一致的方式递增 p 并且 k 是随机的,所以我很难概念化这个时间复杂度。循环运行的次数显然会根据 k 是什么以及从堆中弹出的整数而变化,但我不知道如何用数学和大 O 来表达这一点。

  • 想想最坏的情况,弹出的值始终为 1(假设不可能为零)。
  • 这是否意味着最坏的情况将是 O(n),因为它必须运行 k+1 次?

标签: python time-complexity big-o


【解决方案1】:

要问自己的问题总是“最坏的情况是什么?”想象一个邪恶的精灵选择你所有的输入来让事情尽可能慢。

在这种情况下,k 本身就是一个红鲱鱼,唯一重要的是堆的大小,因为足够大的k 你必须弹出整个东西——所以这就是你的N(堆尺寸)。 (您还会注意到,当这种情况发生时,您的程序会引发 IndexError,因为您没有考虑到这种可能性。)

除了错误之外,很明显循环将运行N 次,每次对堆中的每个元素执行一次,并且每次它将执行pop 操作,即lg N,产生N lg N 作为你最后的最差-案件复杂性。

对这个结果进行完整性检查的一种方法是意识到对列表进行排序的一种方法是将列表堆起来,然后弹出所有元素,因此它可以与其他所有基于比较的排序算法一起跟踪。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-08
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    相关资源
    最近更新 更多