时间复杂度找到前N个数字只能被2,3和5整除

时间:2016-02-29 13:54:53

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

问题 - 找到只能被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;
        }
    }
}

复杂性计算 -

循环#2复杂性 - O(ln(i)),当每个时间数被2整除时,它就会出现,最后它会达到1。

循环#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?
  2. 表示T.
  3. 如果是,那么请帮我转换一下。

1 个答案:

答案 0 :(得分:2)

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

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