【发布时间】: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) ).
问题 -
- 我们可以用 N 来表示 T 吗?
- 如果是,请帮我转换一下。
【问题讨论】:
-
Loop#2 复杂度是 O( ln(i) ) 仅 对于 O(log^3 T) 常规数本身,并且对于所有 O(1) (T) 其他人。
标签: algorithm time-complexity complexity-theory hamming-numbers