时间复杂性有界输入

时间:2016-10-27 16:02:21

标签: algorithm time-complexity

根据这个问题Time complexity to convert a decimal to another base

其中一个答案是

  

严格来说,答案是O(1)。

     

如果int是支持任意精度的整数类型,那么   显然答案是O(logN)。

     

但事实并非如此! int可以得到不大于Integer.MAX_INT的大小   2 ^ 31 - 1 ......或大约20亿。

     

所以,如果我们让N(无界整数)倾向于无穷大,那么值   num包围,以便它永远不会超过Integer.MAX_INT。这意味着   如果(例如)base为10,则while循环最多可以执行   log10(2 ^ 31)次(即10次)......并且convertToBase是O(1)。

     

但是,如果您准备滥用术语/符号,那么   可以说它足够小N是O(logN)。

这让我认为定义为public myAlgorithm (int i)的每个算法都会受到约束?我们要说我需要打印从0n的字符串。

代码只是

public myAlgorithm (int n) {
  for (int i = 0; i <=n ; i++) System.out.println(i);
}

这显然是O(n)对吗?但我们可以使用&#34;有界&#34;称之为O(1)的论据。

有人能否让我更清楚地了解如何应对这种时间复杂性?

3 个答案:

答案 0 :(得分:1)

因为算法在JVM上运行,所以输入是有界的。但这实际上只是实现的限制,而不是算法本身。理论上你可以采用算法并在具有64位整数或任意大小的Java变体上运行它,它仍然是正确的。

因为算法并不依赖于整数有界的事实,所以时间复杂性也不应该。

答案 1 :(得分:0)

我会说引用的答案是滥用术语/符号。遵循其逻辑极端,一切都是O(1),这完全消除了确定复杂性的任何效用。

算法复杂性的整个是它是一个抽象,用于帮助理解问题/算法的底层结构。

答案 2 :(得分:0)

  

这显然是O(n)对吗?但我们可以使用&#34;有界&#34;称之为O(1)的论据。

有界结果获取 - 好吧,它的引用 - 取O(1),但打印结果(n个字符长度的字符串)无论如何都需要O(n)。当n变得足够大以测量/注意差异时,该逻辑起作用。例如,由于所有滚动等,打印2 ^ 32个字符将花费足够长的时间来注意它。

更重要的是,如果你假装n的结果!应该产生结果的计算算法作为真实n的正确字符串表示!值(不是模2 ^ 64),打印字符需要很长时间,比如10050050!