微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决两个单独的嵌套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))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。