图灵机上的操作

问题描述

考虑问题:List := { | A 是包含 a,b 的整数列表,其中 a + b = c},其中 A 的长度为 n。 我们用来证明这个问题是在类 P 中的算法从 A 中添加两个整数,比如 A[i]+A[j] 并检查它是否等于 c。为什么这个测试可以在 O(1) 轮中完成? 提前致谢。

解决方法

谈到计算复杂度有两种方法:

  • 涉及的整数被认为是单个字,即它们有一个固定的范围,通常适合一个 CPU 寄存器。例如,这可以是一个有符号的 64 位整数。

  • 所涉及的整数被认为是无界的:保存它们的内存会有所不同。除非算法真正适用于所谓的“大整数”,否则这是一种更理论化的方法。

我们在维基百科关于 Time complexity 的文章中看到了第一种方法。例如,对于 linear time,它给出了以下示例:

例如,将列表中所有元素相加的过程需要与列表长度成正比的时间,如果添加时间是常数,或者至少受常数限制。

维基百科关于 computational complexity of mathematical operations 的文章采用了第二种方法。例如,对于 addition,它有:

操作 输入 输出 算法 复杂度
补充 两个 ? 位数字,? 和 ? 一个?+1位数字 随身携带教科书 Θ(?),Θ(log(?))

对于有问题的算法

我假设列表成员是有符号整数。

根据第一种方法,两个整数的加法和比较的时间复杂度都是O(1),所以总的时间复杂度是O(?²)。

根据第二种方法,加法和比较都是 O(log(max(abs(??)))。我们也可以在这里使用?:但即使它有更大的绝对值比所有对的总和,我们可以用 max(abs(??))) 的时间复杂度进行比较。所以总的时间复杂度是 O(log(max(abs(??)))?²).