Algorithm 运行sort两次的Big-O运行时

Algorithm 运行sort两次的Big-O运行时,algorithm,big-o,Algorithm,Big O,我对使用big-O表示法确定算法运行时的实践比较陌生,我对排序算法的运行时有一个问题。假设我在一个数组中有一组对(a,b),我使用运行在O(n logn)中的已知排序算法对数据进行排序。接下来,我从n个数据点中选取一个子集,并在该子集中运行相同的排序算法(因此理论上我可以对整个数组进行两次排序-第一次排序将比较a,第二次排序将比较b)。换句话说,我的代码是 pairArray[n]; Sort(pairArray); //runs in O(n log n) subsetArray[subse

我对使用big-O表示法确定算法运行时的实践比较陌生,我对排序算法的运行时有一个问题。假设我在一个数组中有一组对(a,b),我使用运行在O(n logn)中的已知排序算法对数据进行排序。接下来,我从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)
pairArray[n];
排序(pairArray)//在O(n日志n)中运行

海底[子集]//其中,在大O表示法中忽略子集常量因子。两次排序仍然是O(n log n)

您正在执行的赋值循环是一个O(n)操作。这也被忽略了。在big-O表示法中只提到最大项


如果您想确定两种算法中哪一种更好,但它们的big-O是相同的,那么您可以对实际数据使用性能度量。在测量实际性能时,您可以看到一种算法的速度通常是另一种算法的两倍。从大O表示法中看不到这一点。

在大O表示法中忽略常量因子。两次排序仍然是O(n log n)

您正在执行的赋值循环是一个O(n)操作。这也被忽略了。在big-O表示法中只提到最大项


如果您想确定两种算法中哪一种更好,但它们的big-O是相同的,那么您可以对实际数据使用性能度量。在测量实际性能时,您可以看到一种算法的速度通常是另一种算法的两倍。这不能从大O表示法中看出。

对O(nlogn)算法的固定次数的调用仍将被视为O(nlogn),数学上对O(nlogn)算法的固定次数的调用仍将被视为O(nlogn),数学上的另一种说法是,O(n)表示算法的运行时间为Cn,其中C是任意常数。执行算法两次需要2*Cn时间,但2*C仍然是一个任意常数,因此可以用C替换,这使我们回到C*n或O(n)时间。换句话说,O(n)表示算法的运行时间是Cn,其中C是任意常数。执行算法两次需要2*Cn的时间,但2*C仍然是一个任意常数,因此可以用C替换,这会使我们回到C*n或O(n)时间。