注意:我在算法分析方面是一个超级新手,所以不要将我的任何断言视为绝对真理,我陈述的任何事情(或一切)都可能是错误的。
嗨,我正在阅读有关算法分析和“大O符号”的内容,但有些事情让我感到困惑。
假设您被要求打印字符数组的所有排列,例如[a,b,c]的排列为ab,ac,ba,bc,ca和cb。
那么一种方法是(使用Java):
for(int i = 0; i < arr.length; i++)
for(int q = 0; q < arr.length; q++)
if(i != q)
System.out.println(arr[i] + " " + arr[q]);
如果我没记错,这个算法的时间复杂度符号是O(n2)。
我认为还有其他的做法:
for(int i = 0; i < arr.length; i++)
for(int q = i+1; q < arr.length; q++)
{
System.out.println(arr[i] + " " + arr[q]);
System.out.println(arr[q] + " " + arr[i]);
}
现在这个算法比原来快两倍,但除非我错了,按照大O符号表示法,它也是一个O(2)
这正确吗?可能不是,所以我会重新表述:我错在哪里?