【发布时间】:2016-05-21 10:48:42
【问题描述】:
开始研究复杂性,我正在努力解决这个问题:
void what(int n) {
int i;
for (i = 1; i <= n; i++) {
int x = n;
while (x > 0)
x -= i;
}
}
嗯,第一个 for 循环显然是 O(n)。第一次迭代是O(n),第二次是O(n/2).. 我猜是log(n) 次?
这意味着 O(n) * O(log(n)) = O(n * log(n)) complexity。我做对了吗?
编辑:(不是重复的)我知道大 O 是什么。我已经要求在特定情况下进行正确的评估。
【问题讨论】:
-
恕我直言,根本不是 Big O 的简单英语解释的副本。 OP 知道 Big O 是什么,并且她/他在特定情况下要求正确的评估。
-
看到没有返回值也没有副作用,能确定编译器不会优化掉吗?
-
哇..你会期望这样的问题获得这样的分数吗? SO之谜...
-
注意,这也可能是一个技巧问题。引用维基百科,“算法的时间复杂度量化了算法运行所花费的时间量,作为代表输入的字符串的长度的函数”。这里的输入大小是固定的,并且所有输入的代码都会终止,因此复杂度不能大于 O(1)。事实上,任何自尊的优化编译器都会把整个方法变成空操作。
-
@billc.cn 其实这里
n是一个函数的参数,所以不知道怎么调用。
标签: c algorithm time-complexity