【问题标题】:c loop function computing time complexityc循环函数计算时间复杂度
【发布时间】:2021-02-18 07:24:42
【问题描述】:

我正在学习计算算法的时间复杂度。 可以计算简单循环和嵌套循环,但如果循环内有分配,我该如何计算。 例如:

void f(int n){
    int count=0;
    for(int i=2;i<=n;i++){
        if(i%2==0){
            count++;
        }
        else{
            i=(i-1)*i;
        }
    }
}

i = (i-1)*i 影响循环运行的次数。如何计算此函数的时间复杂度?

【问题讨论】:

  • 我认为这没有一般规则。在这种情况下,i 似乎每隔一次迭代就会翻倍,所以这应该大约是 O(logn)。
  • 指数增长是否表示对数增长?抱歉,我对这个主题有点陌生。你能更详细地解释一下吗? @tobias_k

标签: c algorithm time-complexity


【解决方案1】:

由于i * (i-1) 一直是偶数((i * (i-1)) % 2 == 0),如果 else 部分在循环中一次为真,i++ 使i 成为奇数。因此,在循环中的第一个奇数 i 之后,条件总是在 else 部分内。

因此,在第一次迭代之后,i 将等于 3,这是奇数并进入 else 部分,i 将在每次迭代中增加 i * (i-1) +‌ 1。因此,如果我们用T(n) 表示循环的时间复杂度,我们可以渐近地写成:T(n) = T(\sqrt(n)) + 1。所以,如果n = 2^{2^k}T(n) = k = log(log(n))

【讨论】:

    【解决方案2】:

    没有通用规则来计算此类算法的时间复杂度。你必须使用你的数学知识来获得复杂性。

    对于这个特定的算法,我会这样处理。

    由于最初 i=2 并且它是偶数,因此我们忽略第一次迭代。 所以我只从 i=3 开始考虑。从那以后,我将永远是古怪的。

    你的表达式 i = (i-1)*i 以及 for 循环中的 i++ 最终计算为 i = (i-1)*i+1

    如果将 i=3 视为第一次迭代,并且 i(j) 是第 j 次迭代中 i 的值,则 i(1)=3。 还有

    i(j) = [i(j-1)]^2 - i(j-1) + 1

    上面的方程称为递推关系,有标准的数学方法可以求解它并得到 i 的值作为 j 的函数。有时它是可能的,有时它可能非常困难或不可能。坦率地说,我不知道如何解决这个问题。

    但一般情况下,我们不会遇到需要走那么远的情况。在实际情况下,我只是假设复杂度是对数的,因为 i 的值呈指数增长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多