【问题标题】:Time complexity with bit cost具有比特成本的时间复杂度
【发布时间】:2012-10-06 21:34:52
【问题描述】:

我正试图围绕比特成本(而不是单位成本)研究算法的时间复杂度的概念,似乎不可能找到关于该主题的任何内容.

这是我目前所拥有的:

使用任意算术运算,两个数的 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 是位数,用于任意精度算术。

【问题讨论】:

    标签: algorithm time-complexity


    【解决方案1】:

    使用有限精度算术(例如您的示例中最可能的 32 位 int 乘法),乘法的位成本是恒定的。使用简单的乘法算法将两个int 相乘的成本是O(32^2)(为了更好的算法,请看here)。这与O(1) 相同,因此人们在分析算法时通常会忽略它。

    但是,如果我们使用任意精度算术,那么它就变得很重要。如果一个任意长且值为i 的数字以位存储,它将占用O(log(i)) 位。所以你的代码 sn-p 的成本是O(log(n)^2 * n)(我使用的事实是所有i都不大于n,因为你的循环上升到n)。

    就加法和减法而言,我想说它们都有O(n) 的位成本,其中n 是较小操作数的位数。

    【讨论】:

    • 感谢您的回答,内容非常丰富。关于输入(和比特成本)的时间复杂度案例有什么想法吗?
    • 我同意你对输入场景时间复杂度的分析。如果我们假设位数是恒定的,我们最终会得到一个具有更大常数的线性运行时,就像您写的那样。渐近地,较大的常数无关紧要,因此运行时相对于输入保持线性。
    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    相关资源
    最近更新 更多