【问题标题】:How would I go about analyzing this algorithm using "Big Oh" notation and how could I improve the run time of this algorithm?我将如何使用“Big Oh”表示法分析该算法,如何提高该算法的运行时间?
【发布时间】:2016-10-01 19:15:40
【问题描述】:

算法解释如下:

  1. 如果 n 是偶数:返回 1 + g(n/2)。
  2. 如果 n 是奇数:返回 1 + g(n-1)。
  3. 如果 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);
}

【问题讨论】:

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


    【解决方案1】:

    当一个数字在其二进制表示中最右边时是0。将一个数字除以 2 会删除这个零。

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

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

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

    1111111111111
    

    当这种情况发生时,算法会分两步删除每个 1

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

    所以在最坏的情况下,它需要 2* 1 秒数 才能到达11s 的数量与 log2N 成正比。所以算法属于O(logN)

    【讨论】:

    • @Jean-FrançoisFabre 同样的原因thisthisthis 被否决了 :)
    • 你检查过你的统计数据吗?上周我收到了连续的否决票。我标记了它,投票被撤消了,用户被删除了!至少对于那个,你得到了我的紫外线。
    • @Jean-FrançoisFabre 我不认为这是一个连续的否决票,它更像是对相互竞争的答案投反对票,我真的不想因为 4 个反对票而打扰版主。毕竟 1 次投票不足以让读者完全忽略我的答案。还是谢谢你:)
    • 在这种情况下,为什么其他答案也没有被否决呢?你的解释更好。
    • @Jean-FrançoisFabre 实际上,我认为这个其他回答者正在否决我的竞争答案。就像我提到的其他帖子一样。
    【解决方案2】:

    复杂度:log (n)

    解释:

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

    *****0 => ***** (left shift)
    *****1 => ****0 (change last 1 to 0) => **** (left shift) 
    

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

    所以总操作数:2*log2(n) = O( log2(n) ) .

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2020-08-10
        • 2018-08-08
        • 1970-01-01
        • 1970-01-01
        • 2020-07-07
        • 1970-01-01
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多