我试图围绕研究算法的概念来研究比特成本(而不是单位成本)的时间复杂度,这似乎是不可能的找到关于这个主题的任何内容。
这是我到目前为止所拥有的:
两个数字与n位的乘法和除法的比特成本是,任意算术,O(n ^ 2)。
所以,例如:
int number = 2;
for(int i = 0; i < n; i++ ){
number = i*i;
}
具有关于O(log(n)^ 2 * n)的比特成本的时间复杂度,因为它进行n次乘法并且i
具有log(i)
位。
但在常规情况下,我们希望输入的时间复杂度。那么,这种情况如何运作? i
中的位数可以视为常量。这会使时间复杂度与单位成本相同,除非有更大的常数(因此两者都是线性的)。
对于任意精度算术,加法,减法,比较和赋值变量都是O(n),n是位数。
答案 0 :(得分:4)
使用有限精度算术(例如,在您的示例中最可能是32位int
乘法)乘法的位成本是恒定的。使用朴素乘法算法将int
乘以O(32^2)
的成本为O(1)
(为了更好的algos外观here)。这与i
相同,因此人们在分析算法时通常会忽略它。
如果我们使用任意精度算法,那么它就变得很重要了。如果将具有值O(log(i))
的任意长数字存储在位中,则它将占用O(log(n)^2 * n)
位。因此,您的代码段的费用为i
(我使用的事实是n
不大于n
,因为您的循环上升到O(n)
)。
就加法和减法而言,我会说它们都有n
的位成本,其中{{1}}是较小操作数的位数。