Problem 9-1
a.排序耗时nlg (n),列出它们耗时i,所以总运行时间是O(nlg (n) + i)
b.堆化耗时nlg (n),每次提取耗时lg(n),因此,总运行时间为O((n + i) lg(n))
c.在第i个最大的周围找到并划分需要时间n。然后,从分区中排序长度为i的子数组需要时间ilg(i)。所以,总运行时间是O(n + i lg(i))。
Problem 9-2
a.设mk为小于xk的xi的个数。当每个xi的权重为1/n时,我们得到
和
。使这些和分别< 1/2和≤1/2 的唯一值是
,而x的这个值必须是中位数,因为它有相同数量的大于和小于它的x'。
b.首先使用归并排序在O(n log n)时间内对xi的值进行排序。设Si为这个排序数组的前i个元素的权重之和,并注意更新Si是O(1)。计算S1, S2,…直到k使< 1/2且Sk≥1/2。加权中值是xk。
c.我们修改SELECT以在线性时间内完成此操作。设x为中位数中的中位数。计算和
,看看这两个是否大于1/2。如果不是,停下来。如果是,则对已知包含加权中位数的较小或较大元素的集合进行递归。这不会改变运行时,所以它是Θ(n)。
d.设p为最小值,并假设p不是加权中值。设足够小,使得
<
(|p−pi|),其中如果p = pk我们不包括k。如果pm是加权中位数并且p < pm,则选择> 0。否则选择
< 0。然后我们有
因为和的差取相反的符号。
e.观察
![]()
单独最小化每个和就足够了,我们可以这样做,因为我们分别选择了px和py。在e部分,我们简单地取p = (px, py), px是x坐标的加权中值,py是y坐标的加权中值。
Problem 9-3
a.如果i≥n/2,则使用本章的算法在T(n)时间内得到答案。如果i < n/2,那么,我们可以比较列表中不相交的元素对,然后我们知道第i个最小的元素在每对元素中较小的元素集合中。那么,我们可以递归,这就得到了运行时间在这种情况下是
。注意,最后一项来自于这样一个事实,即第i个最小的元素也可以是任何与子问题中第i个最小元素配对的元素。
b.通过代入法,假设对于较小的n, Ui(n) = n + cT(2i) lg(n/i),则根据i是否< n/4有两种情况。如果它是,
。如果c≥1,这个满足递归式。另一种情况是n/4 ≤ i < n/2。在这种情况下,我们有
。当c≥2时成立。我们可以取c = 2,这两种递归都可以。
c.由上一部分可知,如果i是常数,那么O(T(2i) lg(n/i))就变成了T(lg(n))。那么Ui(n) = n + O(T(2i) lg(n/i)) = n + O(lg(n))。
d,从c部分,我们把n/k代入i得到Ui(n) = n+O(T(2i) lg(n/i)) = n+O(T(2n/k) lgk)。
Problem 9-4
a.我们只需要担心当我们选择一个在min(zi, zj, zk)和max(zi, zj, zk)之间的主元素时会发生什么,因为此时我们要么选择zi或zj并比较它们,要么在zi和zj之间选择一个元素而不比较它们,或者在zk和[zi, zj]区间之间选择一个元素,这样我们就再也不会从a中选择枢轴了
包含zi和zj的范围。我们分成三组。如果zk ≤ zi < zj,则E(Xijk) = 2/(j−k+1)。如果zi ≤ zk < zj,则E(Xijk) = 2/( j−i+1)。如果zi < zj ≤ zk,则E(Xijk) =2/ (k−i+1)。b.
对于第二项,固定某个值m,当j不超过m时,2/(m-k+1)项会出现一次,所以在求和中m - (k +1)次。对于第三项,求和中的每一项都不依赖于j所以我们可以把它写成
。这就给出了
。
c.我们可以将(b)的第二项和第三项的和限定为1,所以这些项的总贡献是n−(k + 1)+1+ k−2 = n−2。
对于第一个双和,考虑c的形式为1/c的项。最多有c个这样的项,因为我们必须有j−i = c−1。出现的最大项为1,出现的最小项为1/n,因此双和的总和最多为n,因此E[Xk]≤2(n + n−2) ≤ 4n。d. RANDOMIZED-SELECT的运行时间主要由RANDOMIZED-PARTITION的运行时间决定,而RANDOMIZED-PARTITION的运行时间主要由比较决定。通过(c)部分,我们知道整个算法(包括递归)的预期比较次数为O(n)。