在算法分析中,"for some constant c"到底是什么意思? (例如,快速排序)

In algorithm analysis, what does "for some constant c" actually mean? (E.g., QuickSort)

考虑以下用于快速排序的递归树,它不断 将子问题分成 3 比 1 的比例(来源:Khan Academy)。

我了解到快速排序中的分区子例程会遍历每个子问题,因此是 O(n)。但是,我对为什么 "Total partitioning time for all subproblems" 是 cn 而不仅仅是 n 感到困惑。在这种情况下,常量代表什么? When/why 会不会是 1? c 是你可以解决的问题,还是更多的 "conceptual" 变量?

如果我没理解错的话,分区子例程只访问给定子问题中的每个元素一次。并且由于每个级别的所有子问题的总和大小为 n,这是否意味着 完全 n 工作在每个级别完成(至少在log n / log4边界)?

谢谢

常量c指的是完成简单任务所花费的时间长度,比如获取一个元素。所以,是的,这是一个概念变量。您将永远无法计算出 c,因为每次迭代都不同。

编辑:我的意思是 c 对于每个实现都是不同的。

What does the constant represent in this case? When/why would it be anything but 1?

让我们把问题翻转一下,看看什么时候正好是 1。这很容易回答。

只有一步时为1。所以当我们做任何事情而不只是一步时,价值会有所不同。

在分区的情况下,我们所做的一些其他事情是计算子分区的新边界(如果我们正在对数组进行分区)或实例化新列表(如果我们对列表进行分区)。

Is c something you can solve for, or more a "conceptual" variable?

是的,您可以成功地尝试求解每个级别的 c 并得出其值,但对于 Big-O,由于 Big-O 忽略了常量,因此没有意义。

... since the sum size of all subproblems at each level is n, doesn't that mean exactly n work is done at each level (at least before the log n / log4 boundary)?

没有。从上面的两个子答案可以看出,工作不是1 * n,而是(some book-keeping, etc. steps) * n,也等于c * n

When/why would it be anything but 1?

在 log4(n) 行的底部,总分区时间表示为 "cn"。由于这一层堆栈树最左边的分支只有一个元素,这意味着即使在单个元素的情况下也是 "c" 操作,并且堆栈树的每个分支的末尾都有一个单个元素将进行 "c" 操作。时间复杂度忽略常量,所以如果分区时间为"c",那么时间复杂度为O(1)。如果分区时间是"cn",那么时间复杂度是O(n).

堆栈树比 log4(n) 更深的唯一变化是正在处理的元素总数小于 n,因此该级别的总分区时间 < "cn",并且在栈树右下角,只有一个元素是process with partition time "c".

在这个基于快速排序的示例中,"c" 并不是一个真正的常量,因为交换次数取决于数据和选择主元的方式。在单个元素的情况下,快速排序通常只是 return 而不会执行分区步骤。