为什么假设乘以 n 的时间复杂度是常数?
Why is it assumpted that the time-complexity of multiplication by n is constant?
无论乘(或除)运算如何实现(即是软件函数还是硬件指令),都无法及时解决O(1)
。对于大 n
值,处理器甚至无法通过一条指令计算它。
在这样的算法中,为什么这些操作是常量而不依赖于 n
?
for (i = 1; i <= n; i++) {
j = n;
while (j > 1)
j = j / 3; //constant operation
}
时间复杂度不是时间的度量。它是 "basic operations" 的度量,可以根据需要定义。通常,任何算术运算都被视为基本运算。有时(比如考虑排序算法的时间复杂度,或者hashtable操作),基本操作就是比较。有时,"basic operations" 是对单个位的操作(在这种情况下,j=j/3
的时间复杂度为 O(log(j)).
倾向于遵循的规则是:
- 如果您谈论的是排序或散列table,基本操作是比较
- 如果您谈论的是任何其他实用算法,基本运算是算术运算和赋值。
- 如果你说的是 P/NP 类,基本操作就是确定性图灵机的步数。 (我认为这相当于位运算)
- 如果您作为复杂性理论专家谈论实用算法,您通常会假设基本类型有 ~log n 位,并且基本操作是对这些 ~log n 位字的算术运算和赋值。
无论乘(或除)运算如何实现(即是软件函数还是硬件指令),都无法及时解决O(1)
。对于大 n
值,处理器甚至无法通过一条指令计算它。
在这样的算法中,为什么这些操作是常量而不依赖于 n
?
for (i = 1; i <= n; i++) {
j = n;
while (j > 1)
j = j / 3; //constant operation
}
时间复杂度不是时间的度量。它是 "basic operations" 的度量,可以根据需要定义。通常,任何算术运算都被视为基本运算。有时(比如考虑排序算法的时间复杂度,或者hashtable操作),基本操作就是比较。有时,"basic operations" 是对单个位的操作(在这种情况下,j=j/3
的时间复杂度为 O(log(j)).
倾向于遵循的规则是:
- 如果您谈论的是排序或散列table,基本操作是比较
- 如果您谈论的是任何其他实用算法,基本运算是算术运算和赋值。
- 如果你说的是 P/NP 类,基本操作就是确定性图灵机的步数。 (我认为这相当于位运算)
- 如果您作为复杂性理论专家谈论实用算法,您通常会假设基本类型有 ~log n 位,并且基本操作是对这些 ~log n 位字的算术运算和赋值。