算法导论 — 思考题7-6 对区间的模糊排序

对区间的模糊排序)考虑这样的一种排序问题:我们无法准确知道待排序的数字是什么。但对于每一个数,我们知道它属于实数轴上的某个区间。也就是说,我们得到了 n n 个形如 [ a i , b i ] [a_i, b_i] 的闭区间,其中 a i b i a_i ≤ b_i 。我们的目标是实现这些区间的模糊排序,即对 j = 1 , 2 , , n j = 1, 2, …, n ,生成一个区间的排列 < i 1 , i 2 , , i n > <i_1, i_2, …, i_n> ,且存在 c j [ a i j , b i j ] c_j ∈ [a_{i_j}, b_{i_j}] ,满足 c 1 c 2 c n c_1 ≤ c_2 ≤ … ≤ c_n
  a. n n 个区间的模糊排序设计一个随机算法。你的算法应该具有算法的一般结构,它可以对左边端点(即 a i a_i 的值)进行快速排序,同时它也能利用区间的重叠性质来改善时间性能。(当区间重叠越来越多的时候,区间的模糊排序问题会变得越来越容易。你的算法应能充分利用这一重叠性持。)
  b. 证明:在一般情况下,你的算法的期望运行时间为 Θ ( n l g n ) Θ(n{\rm lg}n) 。但是,当所有的区间都有重叠的时候,算法的期望运行时间为 Θ ( n ) Θ(n) (也就是说,存在一个值 x x ,对所有的 i i ,都有 x [ a i , b i ] x ∈ [a_i, b_i] 。)你的算法不必显式地检查这种情况,而是随着重叠情况的增加,算法的性能自然地提高。
  
  
  a.
  考虑 2 2 个区间 [ a i , b i ] [a_i, b_i] [ a j , b j ] [a_j, b_j] 之间的关系,分为 3 3 种情况:
  1) b i < a j b_i < a_j
  此时, 2 2 个区间不相交,并且 [ a i , b i ] [a_i, b_i] [ a j , b j ] [a_j, b_j] 的左边。对任意的 c i [ a i , b i ] c_i∈[a_i, b_i] c j [ a j , b j ] c_j∈[a_j, b_j] ,必有 c i < c j c_i < c_j 。所以,在对区间的模糊排序中, [ a i , b i ] [a_i, b_i] 必须要排在 [ a j , b j ] [a_j, b_j] 的左边。因此,可以认为 [ a i , b i ] < [ a j , b j ] [a_i, b_i] < [a_j, b_j]
  2) b j < a i b_j < a_i
  此时, 2 2 个区间不相交,并且 [ a i , b i ] [a_i, b_i] [ a j , b j ] [a_j, b_j] 的右边。对任意的 c i [ a i , b i ] c_i∈[a_i, b_i] c j [ a j , b j ] c_j∈[a_j, b_j] ,必有 c i > c j c_i > c_j 。所以,在对区间的模糊排序中, [ a i , b i ] [a_i, b_i] 必须要排在 [ a j , b j ] [a_j, b_j] 的右边。因此,可以认为 [ a i , b i ] > [ a j , b j ] [a_i, b_i] > [a_j, b_j]
  3) b i a j b_i ≥ a_j 并且 b j a i b_j ≥ a_i
  此时, 2 2 个区间重叠。这意味着至少存在一个 c c ,使得 c [ a i , b i ] c∈[a_i, b_i] 并且 c [ a j , b j ] c∈[a_j, b_j] 。根据模糊排序的定义, [ a i , b i ] [a_i, b_i] [ a j , b j ] [a_j, b_j] 的排列顺序可以任意。因此,可以认为 [ a i , b i ] = [ a j , b j ] [a_i, b_i] = [a_j, b_j]
  根据以上分析,可以将区间当成可以比较的数字一样,对一组区间调用快速排序。为了改善区间重叠情况的排序性能,可以利用思考题7-2提供的方法,对区间相等的情况作特殊考虑。
  
  b.
  根据思考题7-2的分析,如果所有区间都重叠,这意味着所有区间都相等,这种情况的排序时间复杂度为 Θ ( n ) Θ(n)
  也如思考题7-2的结论,该算法的期望运行时间为 Θ ( n l g n ) Θ(n{\rm lg}n)

猜你喜欢

转载自blog.csdn.net/yangtzhou/article/details/88776734