加法的时间复杂度


11

维基百科将加法的时间复杂度列为,其中是位数。ññ

这是严格的理论下限吗?还是这仅仅是当前最快的已知算法的复杂性。我想知道,因为加法的复杂性强调了所有其他算术运算和使用它们的所有算法。

从理论上讲不可能获得在中运行的加法算法?还是我们必须将线性复杂度相加。Øñ

Answers:


17

如果您的算法渐近使用的时间少于次,则它没有足够的时间来读取它所添加的数字的所有数字。您会想象您正在处理非常大的数字(例如存储在8MB的文本文件中)。当然,与数字的相比,加法可以非常快速地完成;如果N是总和的值,它将以Olog N 时间运行。ñØ日志ñN

这并不意味着您可以加快速度。如果处理器每个操作处理32位,则使用次,但这仍然是On而不是onn32O(n)Øñ


理论上来说正在读取所有数据。对于加入任何两个数的b 一个b 一个+ b 2 一个。通过移位可以在O 1 操作中完成计算2 a。附加0。考虑一下。可能您找不到更快的总和估算值,请对该估算值进行调整,直到正确为止。在少于n次操作中?一种b一种一种b一种+b2一种2一种Ø1个0ñ
Tobi Alafin '16

3
是的,这在理论上是必要的,因为:输入的每一位在输出中都被平凡地使用,其中非平凡的意思是它不是恒等函数。在您的示例中,是否可以在O 1 时间内计算2 a取决于计算模型:如果附加0是恒定时间操作,则为是。如果你有内存访问,你需要Ø 日志ñ 的时间来写位的地址,如果你已经知道的长度一个Ø ñ 2一种2一种Ø1个0Ø日志ñ一种Øñ时间,如果您必须阅读所有内容进行查找。在该2 一个例子,许多输出位输入比特的琐碎功能。一种2一种
Lieuwe Vinkhuijzen

我有发现的长度的算法Ö 日志Ñ 。它使用二进制搜索。一种Ø日志ñ
托比·阿拉芬

3
@TobiAlafin如果您的模型支持RAM寻址,那么二进制搜索将以步骤运行,正确。在Turing Machine上以及未加载到主存储器中的文本文件中,这需要O n 时间。无论哪种情况,要回答您的问题,无论是否使用RAM寻址来加快查找速度,您的算法都必须查看输入的所有位以计算a + b。假设它没有,并且在输入42位时,它不检查第6位。然后我可以翻转一下,这将给出错误的答案。Ø日志ñØñ一种+b426
Lieuwe Vinkhuijzen

1
因此,基本上所有运算都为。唯一的例外是,如果您正在处理某种有序的数据结构:例如,您不必访问整个BST来检查它是否包含某个值,但这是正确的,仅因为BST附带了不变性。Ωñ
巴库里

7

为了使复杂度分析完全没有任何形式上的意义,您必须指定一个正式的计算模型,在该模型中执行对象中的算法,或者至少指定一个成本模型,该模型指定什么是基本操作,以及他们的费用。

在大多数情况下,假定算术运算需要时间。这通常是合理的,因为我们对算法复杂性感兴趣,而与涉及的数量无关。这称为统一成本模型Θ(1)

如果数字可以无限增长,或者我们有兴趣分析这些运算本身,则算术运算的成本与输入的大小成比例。Θ(|x|)

现在,运营成本可以低于吗?但是,可能必须正式定义一个可以在其中发生的计算模型。


1
作为另一个示例,进位超前加法器在适当的简化假设下花费时间来计算两个n位数字的总和。Θ(logn)n
Fabio Somenzi

3

加法的输入是两个任意数字。由于它们是任意的,因此您必须读取每个位,因此算法为Ω(n)

想象一下,您的算法成功地添加了1010100110和0010010110而不读取每个位。为了使您的算法能够添加任意输入,我应该能够随机翻转这些位中的任意一位,并且该算法仍会输出正确(但不同)的加法。但是,如果您的算法没有读完每一位,那么如何判断翻转后的输入与原始输入有什么不同呢?


n

绝对。您只需要定义算法中“近似”的含义即可。根据该定义,将两个最高有效位相加可以是一个近似和,可以在o(n)时间内完成。当您提到“加法”算法时,我认为我们所有人都认为答案必须准确。
murrdpirate 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.