冰雹序列变化的时间复杂度?

时间:2013-09-18 19:38:05

标签: algorithm big-o time-complexity

考虑以下代码段。

    Looping(n) 
      {
       while (true) {
         if (n <= 1) then return;
          else if (n mod 3 = 0) then n = n * 5 + 1;
         else n = n/9; // integer division
      }

此代码段的最坏情况时间复杂度是多少? `

2 个答案:

答案 0 :(得分:3)

我们可以对此代码做出的一个重要观察是,在采取任何两个步骤之后,n的大小将减少(大致)2/3。这就是原因。考虑n的任何初始值,并查看模3的余数。

  • 如果剩余部分是一个或两个,我们将n除以9并向下舍入。
  • 否则,余数为0.设置n = 5n + 1现在使n的余数为1,所以在下一次迭代中我们将它除以9。然后,n的新值是(5n + 1)/ 9的最低值,(粗略地说)是原始值的5/9。它肯定不超过原始值的2/3。

因此,我们得到它将在O(log n)步骤之后终止,因为每次迭代都会使n减少某个常数因子。

希望这有帮助!

答案 1 :(得分:1)

是O(log(n))。每次你做5n + 1时你用9除以(因为5n + 1 = 1 mod 3,如果n = 0 mod 3),所以最糟糕的是你每两步做一次(5n + 1)/ 9 ,每两步少于2n / 3。这是O(log(n))。如果n mod 3从不为0,那么你每步除以9,也就是O(log(n)),只是用不同的常数。

所以无论你是什么,你都要采取O(log(n))步骤来得到1或0。