算法导论-7-6 对区间的模糊排序
来源:互联网 发布:php插件怎么下载 编辑:程序博客网 时间:2024/05/18 09:06
《算法导论》chapter7 problem7-6对区间的模糊排序
考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in >,使得存在一个 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<aj)那么[ai,bi]<[aj,bj]
else if(bj<ai)那么[aj,bj]<[ai,bi]
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
4712 30466
23267 30245
7134 8098
25400 26351
8079 29052
31163 31738
6346 24352
#include <iostream>#include <ctime>using namespace std;struct IntervalType{ int a; int b;};void Exchange(IntervalType interArry[],int i,int j){ IntervalType tmpInterval=interArry[i]; interArry[i]=interArry[j]; interArry[j]=tmpInterval;}//将区间[oBeg,oEnd]以某区间为基准,分成[oBeg,preEnd]<[preEnd+1,postBeg-1]<[postBeg,oEnd]三个区间void Partition(IntervalType interArr[],int oBeg,int oEnd,int &preEnd,int &postBeg){ IntervalType midInterval=interArr[oEnd]; int i=oBeg-1; int j=oEnd+1; for(int k=oBeg;k<j&&k<oEnd;k++) { if(interArr[k].b<midInterval.a)//区间k比基准区间小 { i++; Exchange(interArr,k,i); } else if(interArr[k].a>midInterval.b)//区间k比基准区间大 { j--; Exchange(interArr,k,j); k--; } else//两个区间有重叠,视作相等,取它们重叠的部分作为基准区间继续划分 { midInterval.a=max(midInterval.a,interArr[k].a); midInterval.b=min(midInterval.b,interArr[k].b); } } preEnd=i; postBeg=j;}void IntervalQuickSort(IntervalType interArr[],int iBeg,int iEnd){ if(iBeg>=iEnd)return; int preEnd,postBeg; //将区间[iBeg,iEnd]以某区间为基准,分成[iBeg,preEnd]<[preEnd+1,postBeg-1]< [postBeg,iEnd]三个区间 Partition(interArr,iBeg,iEnd,preEnd,postBeg); IntervalQuickSort(interArr,iBeg,preEnd); IntervalQuickSort(interArr,postBeg,iEnd);}
- 算法导论 7-6 对区间的模糊排序
- 算法导论-7-6 对区间的模糊排序
- 算法导论-7-6 对区间的模糊排序
- 算法导论 思考题7_2 对区间的模糊排序
- 对区间的模糊排序(原题算法导论第三版思考题7-6)
- 算法导论7.6对区间的模糊排序
- 算法导论第7章课后题(对区间的模糊排序)
- 【算法导论笔记】模糊排序7-6
- 对区间的模糊排序
- 对区间的模糊排序
- 快速排序.对区间的模糊排序
- (p106)对区间的模糊排序(将相同元素挤在一起的快排)
- 区间模糊排序
- 区间 模糊排序
- 区间模糊排序
- 算法导论 区间树
- 《算法导论》的堆排序
- 算法导论6:堆排序
- 打靶问题。一个射击运动员打靶,靶一共有10环,连开10 枪打中90环的可能性有多少?
- 第十一周上机任务项目5-体验文件操作练习1
- Hadoop平台在云计算中的应用
- Struts+Spring+Hibernate jar包介绍
- Asp.NET控制输入数字和字母的函数
- 算法导论-7-6 对区间的模糊排序
- 性能测试小结
- 云计算IDC技术架构与业务运营模式
- The USB composite framework
- 第一次求职历程(java软件研发/开发工程师)
- Kinect for Windows SDK开发入门
- 北京小学名校排名
- 网站如何中英文切换?
- Makefile中 变量赋值含义