拥有这个简单的Java代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Simple {
public static void main(String[] args) {
List list = new ArrayList();
list.add(5);
list.add(4);
list.add(3);
Collections.sort(list);
}
}
如何在不知道Collection.sort方法的复杂性的情况下计算此算法的复杂性?
我应该去java doc并搜索Collection.sort源代码,然后计算它的复杂性?
注意:Collection.sort只是预定义方法的一个示例。
由于
答案 0 :(得分:2)
如何在不知道System.out.println方法的复杂性的情况下计算此算法的复杂性?
严格地说,你不能。
另一方面,通常的做法是在算法分析中包含I / O的详细复杂性。通常我们假设I / O的行为方式通常被理解为......因为真正的复杂性分析是难以处理的。
实际上假设简单的I / O(像这样)具有O(N)
的复杂性,其中N
是读取或写入的字节/字符数
我应该去java doc并搜索System.out.println源代码然后计算它的复杂性吗?
没有。见上文。
好的,但是如果我调用排序预定义的java方法呢?
Collections.sort(List<?>)
的javadoc说:
此实现遵循使用指定列表和空比较器的List.sort(Comparator)方法。
反过来说:
实现注意事项:此实现是一个稳定的,自适应的迭代合并输出,当输入数组被部分排序时,需要远远少于n lg(n)的比较,同时在输入数组随机排序时提供传统mergesort的性能。如果输入数组几乎已排序,则实现需要大约n次比较。临时存储要求从几乎排序的输入数组的小常量到随机排序的输入数组的n / 2个对象引用不等。
一般来说,要确定标准类库中类的复杂性,请阅读javadoc,如果javadoc没有说,那么找到并分析源代码......或根据您的需要做出合理的假设实际使用的数据结构知识。
情况应确定您的复杂性分析是否需要严格。如果不需要严谨,您可以在分析中采取捷径......只要您得到正确的答案: - )
在任何一种情况下,请注意算法几乎总是&#34;一个实现细节&#34;并且性能和空间复杂性(至少在理论上)可能会发生变化。
答案 1 :(得分:1)
这个hello-world程序具有恒定的时间复杂度,例如,因为没有输入。 而且你实际上并没有在打印字符串时进行任何计算。
答案 2 :(得分:0)
样本没有任何输入,因此O是常数,或O(1)。复杂性仅在您输入大小为N时才有意义,并且程序中存在某种循环或者对相关函数进行递归调用,因此运行时间取决于输入。就像Sanjeev Sharma所说,在这种情况下寻找复杂性是荒谬的。