【问题标题】:What is the time complexity of this code fragment?这个代码片段的时间复杂度是多少?
【发布时间】:2015-03-31 08:44:24
【问题描述】:
void push(const Type& e){
        if (size() == CAP) {
            CAP = CAP + 100;
            Type * Snew = new Type[CAP];
            for (int i = 0; i < CAP - 100; i++){
                Snew[i] = S[i];
            }
            delete[] S;
            S = Snew;
        }
        TOP++;
        S[TOP] = e;
    }

这个算法的时间复杂度是多少,为什么?我正在看它,希望我没有错,但我认为由于存在单个 for 循环,它具有线性时间 (O(n)) 复杂性,而且我认为循环之外的所有其他操作都是恒时操作。

【问题讨论】:

  • 您是对的,只是您的代码中没有任何n。时间复杂度为O(CAP)
  • 循环内的 size() 和赋值都可能很复杂,如果没有更多信息,这个问题就无法回答。此外,您可能需要考虑摊销成本:调用函数 n 次的平均成本。这样,假设丢失的代码都是 O(1),您将看到 CAP+100(平均成本 O(n))和 CAP*2(平均成本 O(1))之间的差异。

标签: algorithm time big-o complexity-theory analysis


【解决方案1】:

这是 O(n),好吧。根据 new 的实现,这也可能是 O(n) 而不是常量(如果它正在清除内存或其他东西),但这仍然使整个事情 O(n)。

【讨论】:

    【解决方案2】:

    复杂度为 O(n)。但是,请注意,大多数堆栈实现将数组的大小加倍,而不是增加固定数量,以实现摊销的常数时间。请参阅Constant Amortized Time 进行讨论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-26
      • 2022-11-14
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多