算法导论思考题7_2对区间的模糊排序
这个学期在做算法设计课的助教,很多题以前做过就忘记了,重做特地记录下。
《算法导论》chapter7 problem7-6对区间的模糊排序
考虑这样⼀种排序问题,即⽆法准确的知道等排序的各个数字到底是多⼤.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的⽬标是对这些区间进⾏模糊排序(fuzzy-sort),亦即,产⽣各区间的⼀个排序,使得存在⼀个 cj ∈[ai, bi ],满⾜c1≤c2≤…≤cn .
a)为n个区间的模糊排序设计⼀个算法,你的算法应该具有算法的⼀般结构,它可以快速排序左部端点(即各ai ),也要能充分利⽤重叠区间来改善运⾏时间.(随着各区间重叠得越来越多,对各区间的排序的问题会变得越来越容易,你的算法应该能充分利⽤这种重叠.) b)证明: 在⼀般情况下,你的算法的区望运⾏时间为 O(n*lgn),但当所有的区间都重叠时,期望的运⾏时间为O(n) (亦即,当存在⼀个值 x, 使得对所有的 i, 都有x∈[ai, bi ] ).你的算法不应显式的检查这种情况,⽽是应当随着重叠量的增加,性能⾃然地有所改善. 解答
a. 算法思想基本是仿快速排序对区间进⾏排序。难点在于如何充分利⽤重叠区间来改善运⾏时间?其关键在于Partion()的设计。
对于如何充分利⽤重叠区间,解决思路是在调⽤Partion()划分时,区间如果重叠的部分,就把它们看做是相等的,并提取公共部分继续划分。即对于区间[ai,bi],[aj,bj],它们⼤⼩分为三种情况。 if(bi
else if(bj
else [ai,bi]=[aj,bj]。
⽹上其它⼈的解答,思路都是类似的,不过看了⼏个版本,不少⼈在代码实现上多少有点bug。⼀个易错的地⽅是在判定两个区间相等的情况后,要提取它们公共区域继续划分。另⼀个错误有点难描述,以下⾯的代码为例,在else if(interArr[k].a>midInterval.b){}⾥⾯,没有加上“k--”这⼀⾏代码。⾄于什么要加⼀⾏代码,因为在interArr[k]⽐基准midInterval⼤⽽需要Exchange时,和interArr[j]交换时,interArr[j]也可能⽐基准midInter⼤的。我们如果不k--,那么就会直接跳过去了。这样说如果有点模糊的话,可以拿下⾯数据模拟⼀次就明⽩了。28508 31359