我将如何使用" Big Oh"来分析此算法?符号,我怎么能改善这个算法的运行时间?

时间:2016-10-01 19:15:41

标签: java algorithm recursion time-complexity big-o

算法解释如下:

  1. 如果n是偶数:返回1 + g(n / 2)。
  2. 如果n为奇数:返回1 + g(n-1)。
  3. 如果n = 1:返回1.
  4. 代码:

    public static int g(int n)
    {
        if (n==1)
            return 1;
        else if (n%2==0)
            return 1 + g(n/2);
        else
            return 1 + g(n-1);
    }
    

3 个答案:

答案 0 :(得分:1)

当一个数字是偶数时,其二进制表示中的最右位是0。将数字除以2将删除此零。

N = 16       => 8       => 4      => 2     => 1
    (10000)2 => (1000)2 => (100)2 => (10)2 => 1

当数字为奇数时,其二进制表示中最右边的位为1。该算法在收到奇数时计算数字。减少奇数将导致将最右边的位从1更改为0。因此,数字变为偶数,然后算法将此数字除以2,以便删除最右边的位。

因此,当数字的二进制表示由所有1 s组成时,算法的最坏情况发生:

1111111111111

当发生这种情况时,算法所做的就是分两步删除每一步

1111111111111 decrement it because it is odd
1111111111110 divide it by two because it even 
111111111111

因此,在最坏的情况下,需要2 * 个1s 才能达到1 1s 的数量与log 2 N成比例。因此该算法属于 O(logN)

答案 1 :(得分:0)

复杂性:log(n)

说明:

如果你看一下n和g(n)的二进制表示法。

arrayName[indexOfElementYouWant]

因此,在最坏的情况下,它每2次迭代减少一位。

所以操作总数: 2 * log 2 (n) = O(log 2 (n))< / strong>。

答案 2 :(得分:0)

O(lg(n)):如果输入是2的幂,则每个调用除以2,显然是lg(n)。对于任何其他输入,至少每秒操作除以2(如果一个操作减去一个,则输入在之前关闭,现在是偶数)。因此,最多2*log(n)次操作是O(lg(n))