根据这个问题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)
的每个算法都会受到约束?我们要说我需要打印从0
到n
的字符串。
代码只是
public myAlgorithm (int n) {
for (int i = 0; i <=n ; i++) System.out.println(i);
}
这显然是O(n)对吗?但我们可以使用&#34;有界&#34;称之为O(1)的论据。
有人能否让我更清楚地了解如何应对这种时间复杂性?
答案 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!