【发布时间】:2016-01-31 23:01:06
【问题描述】:
我正在编写一个比较算法,它以 n 个数字和一个数字 k 作为输入。
它将 n 个数分成 k 个组,使组 1 中的所有数都小于组 2 的所有数,...,小于组 k。
同一组的数字不一定是排序的。
我正在使用 selection(A[],left,right,k) 来查找第 k 个元素,在我的例子中是 n/k 元素(将整个数组分成 2 部分)和然后对每一部分重复,直到初始数组被分成 k 个部分,每个部分有 n/k 个数字。
它的复杂度为 Θ(n logk),因为它是一个 logk 级别(深度)的树,每个级别花费最大 cn 计算。这是线性时间,因为 logk 被认为是一个常数。
我被要求证明以这种方式将 Array[n] 排序到 k 个组的所有比较算法在最坏的情况下花费 Ω(nlogk)。
我在这里搜索过,谷歌和我的算法书(Jon Kleinberg Eva Tardos)我只找到了对所有元素进行排序的比较算法的证据。这种算法复杂性的证明在我的案例中是不被接受的,因为所有这些都是在不满足我的问题的情况下,也不能改变它们来满足我的问题。 (还要考虑随机选择的常规快速排序会导致 Θ(nlogn) 与 Ω(nlogk) 不是线性的)
您可以在此处找到通用算法证明: https://www.cs.cmu.edu/~avrim/451f11/lectures/lect0913.pdf 其中也清楚地解释了为什么我的问题不属于 O(nlogn) 的比较排序情况
【问题讨论】:
-
这可能更适合cs.stackexchange.com。
-
矛盾证明:更好的下限适用于
k=n,这将证明是基于比较的排序的更好下限。
标签: algorithm sorting selection complexity-theory quicksort