Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在算法分析中,什么是;对于某些常数c“;实际上是什么意思?(例如,快速排序)_Algorithm_Sorting_Quicksort_Asymptotic Complexity - Fatal编程技术网

Algorithm 在算法分析中,什么是;对于某些常数c“;实际上是什么意思?(例如,快速排序)

Algorithm 在算法分析中,什么是;对于某些常数c“;实际上是什么意思?(例如,快速排序),algorithm,sorting,quicksort,asymptotic-complexity,Algorithm,Sorting,Quicksort,Asymptotic Complexity,考虑以下用于快速排序的递归树,它不断地将子问题划分为3:1的比例(源:)。 我知道quicksort中的分区子例程迭代每个子问题,因此是O(n)。但是,我不明白为什么“所有子问题的总分区时间”是cn,而不仅仅是n。在这种情况下,常数代表什么?什么时候/为什么不是1?c是您可以解决的问题,还是更像一个“概念”变量 如果我理解正确,分区子例程只访问给定子问题中的每个元素一次。由于每个级别上所有子问题的总大小都是n,这难道不意味着在每个级别上都做了n工作(至少在logn/log4边界之前) 感谢常数

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

我知道quicksort中的分区子例程迭代每个子问题,因此是
O(n)
。但是,我不明白为什么“所有子问题的总分区时间”是
cn
,而不仅仅是
n
。在这种情况下,常数代表什么?什么时候/为什么不是1?
c
是您可以解决的问题,还是更像一个“概念”变量

如果我理解正确,分区子例程只访问给定子问题中的每个元素一次。由于每个级别上所有子问题的总大小都是
n
,这难道不意味着在每个级别上都做了
n
工作(至少在
logn/log4
边界之前)


感谢

常数c表示完成简单任务(如获取元素)所需的时间长度。所以,是的,这是一个概念变量。你永远无法计算c,因为每次迭代都是不同的

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

在这种情况下,常数代表什么?什么时候/为什么不是1

让我们把问题翻过来,看看什么时候正好是1。这是一个简单的答案

当只有一步可走时,它将是1。因此,当我们做任何事情而不仅仅是一个步骤时,值会发生变化

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

c
是您可以解决的问题,还是更像一个“概念”变量

是的,您可以成功地尝试为每个级别求解
c
,并得出其值,但如果是大O,则没有意义,因为大O忽略了常量

。。。由于每个级别上所有子问题的总大小都是
n
,这是否意味着在每个级别上(至少在logn/log4边界之前)都完成了
n
工作

不。从上面的两个子答案可以清楚地看出,这项工作不是
1*n
,而是
(一些簿记等步骤)*n
,也等于
c*n

什么时候/为什么不是1

在log4(n)行的底部,总分区时间表示为“cn”。由于该级别的堆栈树最左边的分支只有一个元素,这意味着即使在单个元素的情况下,这些操作也是“c”操作,并且具有单个元素的堆栈树的每个分支的末尾都将执行“c”操作。时间复杂度忽略常数,因此如果分区时间为“c”,则时间复杂度为O(1)。如果分区时间为“cn”,则时间复杂度为O(n)

堆栈树比log4(n)更深的地方唯一的变化是正在处理的元素总数小于n,因此该级别的总分区时间小于“cn”,在堆栈树的右下角,只有一个元素是分区时间为“c”的进程


在这个基于快速排序的示例中,“c”实际上并不是一个常数,因为交换的数量取决于数据以及如何选择枢轴。对于单个元素,快速排序通常只返回,而不执行任何分区步骤。

处理被分区的元素会有成本。您必须获取元素,运行比较,然后将值放入正确的bucket中。每个被划分的元素花费的时间。当你说“正好n个工作”,那是什么意思?什么是工作?我知道我们在谈论时间,但现在是一分钟吗?一秒钟?一微秒?这不取决于你买电脑花了多少钱吗?
c
是一个常数。每次迭代都是一样的。也许你的意思是,它在每个实现中都是不同的,这是真的。是的,这正是我的意思。谢谢你指出这一点。