我对使用big-O表示法确定算法运行时的做法比较陌生,我对排序算法的运行时有疑问。假设我在数组中有一组对(a,b),我使用在O(n log n)中运行的已知排序算法对数据进行排序。接下来,我取一些n个数据点的子集并在该子集上运行相同的排序算法(因此理论上我可以对整个数组进行两次排序 - 第一种是比较a和第二种比较b的) 。换句话说,我的代码是
pairArray[n];
Sort(pairArray); //runs in O(n log n)
subsetArray[subset]; //where subset <= n
for (int i = 0; i < subset; i++) {
subsetArray[i] = pairArray[i];
}
Sort(subsetArray) //runs in O(n log n)
此代码的运行时是否仍为O(n log n)?我想我有两个问题:运行O(某事)排序两次会增加原始“某事”的复杂性,并且迭代重新分配给不同的数组会增加复杂性吗?我更担心第一个,因为迭代可以用指针消除。
答案 0 :(得分:3)
大写符号中忽略了约束因子。排序两次仍为O(n log n)。
您正在进行分配的循环是O(n)操作。这也被忽略了。 big-O表示法中只提到了最大的术语。
如果您想确定哪两种算法更好但是它们的大O是相同的,那么您可以在实际数据上使用性能测量。在测量实际性能时,您可以看到一种算法的速度通常是另一种算法的两倍。从大O符号中无法看出这一点。