当前位置: 首页 > 知识库问答 >
问题:

具有while循环和if语句的函数的时间复杂度

边明煦
2023-03-14
int dup_chk(int a[], int length) 
{
  int i = length;
  while (i > 0)
  {
    i--;
    int j = i -1;
    while (j >= 0)
    {
      if (a[i] == a[j])
      {
        return 1;
      }
      j--;
    }
  }
  return 0;
}

所以我想我知道的是:

  • 第1行只是1。
  • 第一个时循环是N 1。
  • i--;是N次,因为它在第一个while循环中。
  • j=i-1;也是N.
  • 第二个时循环是(N 1)N=N^2 N,因为它是时循环中的时循环
  • if语句:???
  • j--;是N(N)=N^2
  • 返回0;是1

我对计算算法的时间复杂度非常陌生,所以我甚至不确定我认为我知道的是否完全正确。但是让我困惑的是if语句,我不知道如何计算它(如果它之后还有一个其他语句呢?)

编辑:总计等于3/2N^2 5/2N 3我知道这个函数是O(N^2),但不太明白总计是如何计算的。

共有3个答案

赏逸春
2023-03-14

当循环迭代时,执行if检查的次数与内部检查的次数相同。

根据定义,返回1最多只执行一次。您似乎假设输入中没有重复项(即最坏情况),在这种情况下,返回1语句从不执行。

你最终会感觉到你可以忽略代码的哪些部分,所以你不需要计算这个“总计”,只需要意识到有两个嵌套的循环,每个循环遍历数组-即O(N^2)。

郜俊健
2023-03-14

也许这可以帮助您了解代码中的错误。我添加了一些打印输出,以便更容易理解代码中发生的情况。我认为这应该足以找到您的错误

int dup_chk(int a[], int length)
{
    int j = 0;
    int i = length;
    char stringa[30];

    printf("Before first while loop j = %d and i = %d \n", j, i);
    while (i > 0)
    {
        i--;
    j = i - 1;
    printf("\tIn first while loop j = %d and i = %d\n", j, i);
    while (j >= 0)
    {
        printf("\t\tIn second while loop j = %d and i = %d\n", j, i);
        if (a[i] == a[j])
        {
            printf("\t\tIn if statment j = %d and i = %d\n", j, i);
            return 1;
        }
        j--;
        printf("\t\tEnd of second while loop j = %d and i = %d\n", j, i);
    }
}
printf("After first while loop j = %d and i = %d \n", j, i);
printf("Press any key to finish the program and close the window\n");
return 0;
}

我还建议您调试代码,以更好地了解情况。

安奇
2023-03-14

通常不需要对时间复杂度进行如此准确的分析。根据Big-O了解它就足够了。然而,出于自己的好奇心,我做了一些计算。

如果您关心的只是获得时间复杂度的最坏情况分析,请考虑一个只有唯一元素的数组。在这种情况下:

  • 返回1语句从不执行。内部while循环执行N(N-1)/2次(总和i-1从1到N),并发生三件事-检查while条件(并计算为true),检查if条件(并计算为false),并减小变量j。因此,操作数为3N(N-1)/2
  • 外部while循环执行N次,除条件检查外,还有三条语句-i递减,分配j,内部while条件失败N次。也就是说,还有4N次操作
  • 在所有循环之外,还有三条语句。初始化i,while条件失败一次,然后返回语句。再加上3个

3/2N2-3/2n4n3。

那是3/2N25/2N 3。这是你的“总数”。

我再说一遍,这种计算对于所有实际目的来说都是完全没有必要的。

 类似资料:
  • 所以程序应该是:-获取用户的输入,直到用户键入“n或N”以显示停止的标志-当用户键入“n或N”时,程序正数和负数和。 还有我得到的 这个错误信息,我不知道是什么问题。提前谢谢你!

  • 我试图为这段代码找出一个大O的紧密界限: 如果我们从内最循环开始,它将在最坏的情况下运行k=n^2次,占O(N^2)。如果语句每次j=m*i时都为真,其中m是一个任意常数。由于j从1运行到i^2,这将在m={1,2,...,i}时发生,这意味着它将在i次时为真,i最多可以是n,所以最坏的情况将是m={1,2,...,n}=n次。如果i=n,第二个循环应该有O(N^2)的最坏情况。外环具有O(N)的

  • 我正在为学校做一个简单的Java计算器,效果很好。但是,我需要添加一个while循环,询问用户是否要继续是/否。不过,我不知道应该将while语句放在哪里。我试着把if语句放在上面,我试着把它放在下面,然后把它添加到每个if和else if语句中,但仍然无法让它工作。在if和else-if语句中,应该在哪里放置while循环,以获得运行while循环的所有选项?

  • Python 中,while 循环和 if 条件分支语句类似,即在条件(表达式)为真的情况下,会执行相应的代码块。不同之处在于,只要条件为真,while 就会一直重复执行那段代码块。 while 语句的语法格式如下: while 条件表达式:     代码块 这里的代码块,指的是缩进格式相同的多行代码,不过在循环结构中,它又称为 循环体。 while 语句执行的具体流程为:首先判断条件表达式的值,

  • if语句 (实际上是if表达式) OCaml有两种if语句: if boolean-condition then expression if boolean-condition then expression else other-expression 不同于传统的语言,if语句是表达式。它们更类似于C类语言中的三元操作符?: 而不是你所熟悉的if语句。 下面是if语句的简单例子: # le

  • 本文向大家介绍ASP中if语句、select 、while循环的使用方法,包括了ASP中if语句、select 、while循环的使用方法的使用技巧和注意事项,需要的朋友参考一下 具体的介绍就不多说了,大家看下实例就可以了 考虑后期的便于阅读,呐喊教程小编再为大家整理一下 asp if语句 ①if A then B ②if A then B end if ③if A then B else C e