java – 如何使用“Big Oh”表示法分析此算法,如何改善此算法的运行时间?

算法解释如下:

>如果n是偶数:返回1 g(n / 2).
>如果n为奇数:返回1 g(n-1).
>如果n = 1:返回1.

码:

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);
}

最佳答案 当数字为偶数时,其二进制表示中的最右位为0.将数字除以2将删除此零.

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

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

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

1111111111111

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

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

因此,在最坏的情况下,需要2 *个1来达到1. 1的数量与log2N成比例.所以该算法属于O(logN).

点赞