@
linboki 好吧,就按你对装逼的定义,我是在装逼。那你看我这次装逼还成功不 :P
@
ipoh @
reus @
jsq2627 请看 13 楼,我订正过了。
4 楼的代码是我临时直接手写的,并且 v2 不能编辑,所以非常不好意思。
不过其实没有大的影响,
while (sum < n) { sum += i++;}
和
for (int i = 0; i < n; i++) {bar++;}
在时间复杂度上都是一样的。
(根号 2)^n 和 2^n ,以及 10^n ,没有本质区别。
(虽然在错误的理解下,一个是 O(n),一个是 O(根号 n))
此外,@ipoh 在 124 楼的回复。
计算复杂性理论只是讨论算法的,绝对不应该去考虑现实限制的(当然工程师都一定忍不住去考虑)。
因为讨论的是算法的理论性质,和具体计算机无关,摘自维基:
“计算复杂性理论通过引入数学计算模型来研究这些问题以及定量计算解决问题所需的资源,
....计算复杂性理论的一个作用就是确定一个能或不能被计算机求解的问题的所具有的实际限制。”
喏,不能本末倒置啊,讨论计算复杂性时,是不需要考虑限制的。
并且就算有实际限制,也和是 O(n)还是 O(2^n)无关的啊。
这是不小心引出的另一个话题,限制 32bit 的话,那就都变成 O(1)了。
@
jhdxr 所以,为什么叫作“伪”多项式时间?
里面不是有这句话么:
“因此素性测试问题的时间复杂度用 D 表示应为 O ( 2 D / 2 ) {\displaystyle O(2^{D/2})} O(2^{{D/2}})”
@
reus @
jedihy https://en.wikipedia.org/wiki/Time_complexity“ In computer science, the time complexity of an algorithm quantifies the amount of time taken by an algorithm to run as a function of the length of the string representing the input.”
看看我有木有偷换概念,以及 n 应该代表什么。