这是我写的SelectionSort例程。我的复杂性分析是否正确?
public static void selectionSort(int[] numbers) {
// Iterate over each cell starting from the last one and working backwards
for (int i = numbers.length - 1; i >=1; i--)
{
// Always set the max pos to 0 at the start of each iteration
int maxPos = 0;
// Start at cell 1 and iterate up to the second last cell
for (int j = 1; j < i; j++)
{
// If the number in the current cell is larger than the one in maxPos,
// set a new maxPos
if (numbers[j] > numbers[maxPos])
{
maxPos = j;
}
}
// We now have the position of the maximum number. If the maximum number is greater
// than the number in the current cell swap them
if (numbers[maxPos] > numbers[i])
{
int temp = numbers[i];
numbers[i] = numbers[maxPos];
numbers[maxPos] = temp;
}
}
}
复杂性分析
Outter Loop(比较和分配):2次操作执行n次= 2n ops
分配maxPos:n ops
内环(比较和分配):2个操作执行2n ^ 2次=2n²操作
数组元素的比较(2个数组引用和比较):3n²ops
分配新的maxPos:n²ops
数组元素的比较(2个数组引用和比较):3n²ops
作业&amp;数组引用:2n²ops
作业&amp; 2个数组引用:3n²ops
作业&amp;数组引用:2n²ops
基本操作总数
2n + n +2n²+3n²+ n ^ 2 +3n²+2n²+3n²+2n²=16n²+ 3n
通向Big Oh(n²)
这看起来是否正确?特别是当它涉及内环和内部的东西时......
答案 0 :(得分:2)
是的,O(N 2 )是正确的。
编辑:就“从第一原则”而言,很难猜到他们可能想要什么,但我猜他们正在寻找(实质上)某些东西证明(或至少表示)满足big-O的基本定义的顺序:
存在正常数 c 和 n 0 ,以便:
对于所有n≥n 0 ,0≤f(n)≤cg(n)。
因此,找到16N 2 + 3N后的下一步是找到n 0 和c的正确值。至少乍看之下,c似乎是16,而n 0 ,-3,(可能被视为0,负数没有实际意义)。
答案 1 :(得分:1)
通常,添加实际操作是毫无意义的(并且不正确),因为操作需要不同数量的处理器周期,其中一些是从内存中取消引用值,这需要花费更多时间,然后由于编译器优化代码而变得更加复杂,那么你有缓存局部性等等,所以除非你知道真的,非常好一切如何在下面工作,你要加上苹果和橘子。你不能只把“j&lt; i”,“j ++”和“numbers [i] = numbers [maxPos]”加起来好像它们是相同的,而你不需要这样做 - 为了复杂度分析,恒定时间块是一个恒定的时间块。您没有进行低级代码优化。
复杂性确实是N ^ 2,但你的系数毫无意义。