如果我使用quicksort的修改版本来查找数组中的第k个最小项,为什么预期的运行时间为O(n)(如Programming Pearls所述)?
我正在使用的算法执行以下操作:
1) Runs quick sort on the array
2) If k is > the correct location of pivot, then run quicksort on the 2nd half.
Otherwise run it on the first half.
我认为这需要O(n * logn)工作。
答案 0 :(得分:4)
此链接可能有助于理解随机快速选择的证明http://pine.cs.yale.edu/pinewiki/QuickSelect,
获取Kth顺序统计数据背后的想法是,选择一个数据透视表,并按照快速排序的建议对数据进行分区,并找出要搜索的元素所在的分区。分区具有O(n)的复杂性< / strong>即可。分区后,您需要选择一个结果分区进行进一步处理,而不像快速排序,您必须处理这两个分区。
在下面的描述中,我并不想证明,而是想直观地思考理解预期的复杂性,
为简单起见,让我们假设,在每次迭代中,pivot将数组分成相等的一半,那么复杂性显然是O(n),如
n + (n/2) + (n/4) ... <= c.n, O(n)
为了直观理解,获得最坏情况分区,在每次迭代中必须处理(n-1)个元素,只有(1 / n)的概率发生。所以,无论如何最坏的情况是O(n ^ 2)。
无论如何,如果您需要严格的预期复杂性证明,您可以查看提供的链接。
答案 1 :(得分:0)
这不是本书中描述的算法。更有可能在(1),(2)等处执行一个分区