【问题标题】:Time complexity of two separate nested while loops两个单独的嵌套 while 循环的时间复杂度
【发布时间】:2020-10-30 18:26:14
【问题描述】:

我刚开始我的数据结构课程,但在尝试计算以下代码中的时间复杂度时遇到了麻烦:

{
  int j, y; 
  for(j = n; j >= 1; j--)
  { 
     y = 1; 
     while (y < j)
       y *= 2;
     while (y > 2) 
     y = sqrt(y); 
} 

每次运行代码时,外部“for”循环都会运行 n 次,如果我没记错的话,第一个“while”循环会运行大约 log2(j)。
我不确定第二个“while”循环以及如何确定代码的整体时间复杂度。
我最初的想法是确定在“for”循环的每次迭代中哪个“while”循环会“花费”更多,只考虑两者中较高的一个并将其总结,但显然它并没有让我得到答案。

希望能提供任何帮助,尤其是在尝试计算诸如此类代码的复杂性的过程和总体方法方面。

【问题讨论】:

    标签: data-structures time-complexity structure


    【解决方案1】:

    你说得对,第一个 while 循环的时间复杂度是 O(log(j))。第二个 while 循环重复对 y 执行平方根,直到它小于 2。

    因为y 大约是j(它介于j2j 之间),所以问题是:你多久可以对j 进行一次平方根运算,直到你得到一个小于或等于的数字2?但同样你可以问:在得到大于或等于j 的数字之前,你多久可以平方 2?或者作为一个方程式:

        (((2^2)^...)^2 >= j    // k repeated squares
    <=>        2^(2^k) >= j
    <=>              k >= log(log(j))
    

    所以第二个while循环的时间复杂度为O(log(log(j))。与O(log(j)) 相比,这可以忽略不计。现在由于j &lt;= n 并且循环被迭代n 次,我们得到了整体复杂度O(n log(n))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多