【问题标题】:Time Complexity to find first N numbers only divisible by 2, 3 and 5找到只能被 2、3 和 5 整除的前 N ​​个数字的时间复杂度
【发布时间】:2016-06-12 14:23:56
【问题描述】:

问题 - 找到只能被 2、3、5 整除的前 N ​​个数字的复杂度是多少?

我的努力

代码 -

void printFirstNNumbers(int N) {

    int numbersFound = 0;

    // loop#1
    for(int cnt = 0; ; cnt++) {
        int currentNumber = cnt;

        // loop#2
        while(currentNumber != 1) {
            if(currenNumber%2 == 0) currentNumber /= 2;
            else if(currentNumber%3 == 0) currentNumber /= 3;
            else if(currentNumber%5 == 0) currentNumber /= 5;
            else break;
        }

        if(currentNumber == 1) {
            cout << currentNumber;
            numbersFound++;
            if(numbersFound == N) return;
        }
    }
}

复杂度计算 -

Loop#2 复杂度 - O( ln(i) ),每次数都可以被 2 整除,最后达到 1。

Loop#1 复杂度 - O(T),其中 T 是迭代获得前 N 个数字的次数。

所以复杂度是 ln(i) 的总和,其中 i = 2 到 T。

C = summation of ln(i), where i = 2 to T.

2^C = 2*3*....T = factorial(T)

C = ln( factorial(T) )

where factorial(N) = sqrt(2*pie*N)* (N/e)^N

表示,阶乘(N)与(N)^(3N/2)成正比

由上式,

C = ln ( (T)^(3T/2) ) = (3T/2) ln(T)

C = O(T ln(T) ).

问题 -

  1. 我们可以用 N 来表示 T 吗?
  2. 如果是,请帮我转换一下。

【问题讨论】:

  • Loop#2 复杂度是 O( ln(i) ) 对于 O(log^3 T) 常规数本身,并且对于所有 O(1) (T) 其他人。

标签: algorithm time-complexity complexity-theory hamming-numbers


【解决方案1】:

您要查找的号码称为5-smooth。维基百科文章中的一个界限表明有 O(log^3 T) 5-平滑数字小于 T,所以给定 N,我们需要设置 T = 2^Omega(N^(1/3) )。

如果您要枚举 5 个平滑数字,Dijkstra's algorithm 可能是要走的路,在 O(N) 时间内返回 N 个数字。

【讨论】:

    猜你喜欢
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2021-03-21
    • 1970-01-01
    • 2017-11-24
    相关资源
    最近更新 更多