两个单独的嵌套while循环的时间复杂度

问题描述

我刚开始我的数据结构课程,但是在尝试通过以下代码找出时间复杂度时遇到了麻烦:

{
  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”循环以及如何确定代码的整体时间复杂度。
我最初的想法是确定哪个“ while”循环会在“ for”循环的每次迭代中“花费”更多的钱,仅考虑两者中的较高者并将其加总,但显然并没有使我得出答案。 / p>

我们将不胜感激,尤其是在尝试计算此类代码的复杂性方面的过程和总体方法是什么。

解决方法

您是对的,因为第一个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 <= n并且循环重复了n次,我们得到了总体复杂度O(n log(n))