Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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
Arrays 当数组中只有两个键值时,插入和选择排序的时间复杂性_Arrays_Algorithm_Sorting - Fatal编程技术网

Arrays 当数组中只有两个键值时,插入和选择排序的时间复杂性

Arrays 当数组中只有两个键值时,插入和选择排序的时间复杂性,arrays,algorithm,sorting,Arrays,Algorithm,Sorting,我最近在复习sedgewick的《算法》,第四版,遇到了这样一个问题,无法解决 问题是这样的: 2.1.28等键。制定并验证关于插入运行时间的假设 对只包含两个键值的数组进行排序和选择排序,假设 这些值同样可能出现 说明:您有n个元素,每个元素可以是0或1而不丧失通用性,对于每个元素x:Px=0=Px=1 欢迎任何帮助 选择排序: 时间复杂度将保持不变,因为没有2键假设,它与数组的值无关,仅与元素的数量无关。 在这种情况下,选择排序的时间复杂度为^2 然而,这仅适用于原始算法,该算法在每次外部循

我最近在复习sedgewick的《算法》,第四版,遇到了这样一个问题,无法解决

问题是这样的:

2.1.28等键。制定并验证关于插入运行时间的假设 对只包含两个键值的数组进行排序和选择排序,假设 这些值同样可能出现

说明:您有n个元素,每个元素可以是0或1而不丧失通用性,对于每个元素x:Px=0=Px=1

欢迎任何帮助

选择排序:

时间复杂度将保持不变,因为没有2键假设,它与数组的值无关,仅与元素的数量无关。 在这种情况下,选择排序的时间复杂度为^2

然而,这仅适用于原始算法,该算法在每次外部循环迭代中扫描整个数组尾部。如果您在迭代i中优化它以找到下一个0,因为您已经清除了第一个i-1零,所以第i个零的平均位置在索引2i处。这意味着每次,内部循环都需要进行2i-i-1=i+1次迭代。 总结起来将是:

1 + 2 + ... + n = n(n+1)/2
不幸的是,它仍然在^2上

另一个优化可能是记住上次停止的位置。这将显著提高On的复杂性,因为您不需要多次遍历同一元素,但这将是一种不同的算法,而不是选择排序

插入排序:

在这里,事情更复杂。请注意,在取自的内部循环中,操作数取决于以下值:

while j > 0 and A[j-1] > x
但是,回想一下,在插入排序中,在第i步之后,第一个i元素被排序。因为我们假设Px=0=Px=1,所以i/2元素的平均值为0,i/2为1。 这意味着,内环的平均时间复杂度为Oi/2

总结一下,你会发现:

1/2 + 2/2 + 3/2 + ... + n/2 = 1/2* (1+2+...+n) = 1/2*n(n+1)/2 = n(n+1)/4
但是,上述内容仍在^2中


以上不是一个正式的证明,因为它隐式地使用了EfEx=Efx,这是不正确的,但它可以为您提供如何正式构建证明的指导。

很明显,在搜索下一个smmalest时,您只需搜索,直到找到前一个0为止。例如,在选择排序中,扫描数组,查找下一个最小的数字以交换到当前位置。由于只有0和1,您可以在遇到第一个0时停止扫描,因为它是下一个最小的数字,因此无需在此循环中继续扫描阵列的其余部分。如果未找到0,则排序完成,因为未排序的部分都是1


插入排序基本相同。在这种情况下,它们都是开启的。

首先,你应该记住时间复杂性的含义,然后了解每种排序对其元素的排序方式。然后你可以考虑边界情况,比如,0个元素,10000个元素不是真正的边界情况,n个元素,2个元素:@mayo,那不是2个元素。这是2个键,包含n个元素。我相信其他选民也不理解这个问题,因为它实际上是一个很好的问题。@mayo感谢您回答这个问题:。只是澄清一下,在选择排序的每个循环迭代中,您都从先前停止的位置继续扫描。因此,这不同于普通的选择排序,在这里,您可以多次扫描相同的项目,而在这里,您只能累计扫描数组一次。否。他们都在^2上。您忽略了一个事实,即在第i次迭代中,找到第一个0的概率是有偏差的,因为您跳过了不是零的元素。显然,你可以对它进行很多调整,但这不再是选择排序了。概率无关紧要。该算法基本上是扫描数组一次,然后将任何0交换到开头。这不是选择排序,也不是插入排序。没有人声称这不能在中完成,问题是这两个特定算法的复杂度是多少。好吧,如果你使用选择排序而不做任何修改,那么不管输入是什么,它总是在^2上。至于插入排序,最坏的情况也是在^2上,最好的情况是在输入已排序时打开。因此,未修改的算法将在^2上,但我认为问题意味着我们可以修改算法以优化二进制输入的情况。例如,当我们寻找最小值时,我们可以在找到第一个0时停止,而不是扫描数组的其余部分。非常感谢。我很高兴有人能回答这个问题。我已经阅读了你的解决方案,并从中学到了很多。