算法导论7-6对区间的模糊排序

本文提出了一种针对区间数据的模糊排序算法。该算法借鉴快速排序的思想,通过比较区间的端点来实现排序,并利用区间重叠特性提高效率。当所有区间完全重叠时,算法的时间复杂度可降至O(n)。

题目:

考虑这样一种排序问题,即无法准确的知道等排序的各个数字到底是多大.对于其中的每个数字,我们只知道它落在实轴上的某个区间内.亦即,给定的 n 个形如[ai, bi ]的闭区间,其中ai,≤bi .算法的目标是对这些区间进行模糊排序(fuzzy-sort),亦即,产生各区间的一个排序<i1, i2, i3, i4,…in >,使得存在一个 cj ∈[ai, bi ],满足c1≤c2≤…≤cn .
a)       为n个区间的模糊排序设计一个算法,你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各a),也要能充分利用重叠区间来改善运行时间.(随着各区间重叠得越来越多,对各区间的排序的问题会变得越来越容易,你的算法应该能充分利用这种重叠.)
b)      证明: 在一般情况下,你的算法的区望运行时间为 O(n*lgn),但当所有的区间都重叠时,期望的运行时间为O(n) (亦即,当存在一个值 x, 使得对所有的 i, 都有x∈[ai, bi ] ).你的算法不应显式的检查这种情况,而是应当随着重叠量的增加,性能自然地有所改善.


思考:

借用快排的划分思路,以某个元素为主元,把区域划分成三段,第一段都小于主元,第二段都等于主元

重点是划分,区间如果重叠的部分,就把它们看做是相等的,并提取公共部分继续划分

a.end < b.start ==> a < b

a.start > b.end ==> a > b

其它情况 ==> a = b

为了避免类似于(2,2) (7,7) (1,8)这样的情况,相等时要提取公因子,并更新主元(主元不一等是某个元素)

具体解释都在代码中


代码:

#include <iostream> using namespace std; struct node { int start; int end; bool operator<(const node & b)const { return end < b.start; } bool operator==(const node & b)const { return (end >= b .start) && (start <= b.end); } bool operator>(const node & b)const { return start > b.end; } }; //划分结果:0 -> a小于主元,a+1 -> b-1等于主元,b -> length_A大于主元 struct divid { int a; int b; }; node A[11]; int length_A = 10; //按划分结果分三行显示 void Print(divid d) { int i = 1; if(d.a > 0) { for(i = 1; i <= d.a; i++) cout<<'('<<A[i].start<<','<<A[i].end<<") "; cout<<endl; i = d.a + 1; } if(d.b > 0) { for(; i < d.b; i++) cout<<'('<<A[i].start<<','<<A[i].end<<") "; cout<<endl; i = d.b; } if(i <= length_A) { for(; i <= length_A; i++) cout<<'('<<A[i].start<<','<<A[i].end<<") "; cout<<endl; } cout<<endl; } //交换 void Exchange(node &a, node &b) { node temp; temp = a; a = b; b = temp; } //划分是重点 divid Partition(node *A, int p, int r) { //先取任意一个元素为主元 node x = A[r]; int i = p-1, j = r+1, k = p; while(k <=r && k < j) { //如果小于主元,交换到前面 if(A[k] < x) { i++; Exchange(A[i], A[k]); k++; } //如果大于,交换到后面 else if(A[k] > x) { j--; Exchange(A[j], A[k]); //这里不能k++,因为交换过来的元素也可能大于主元 } else { //如果相等,不交换,但是要提取公因子 x.end = min(x.end, A[k].end); x.start = max(x.start, A[k].start); k++; } } //返回划分结果 divid ret = {i, j}; if(ret.a < p)ret.a = -1; if(ret.b > r)ret.b = -1; Print(ret); return ret; } void QuickSort(node *A, int p, int r) { if(p >= r) return; //把数组划分为三段 divid q = Partition(A, p, r); //如果存在第一段,对第一段排序 if(q.a > 0) QuickSort(A, p, q.a); //如果存在第三段,对第三段排序 if(q.b > 0) QuickSort(A, q.b, r); } int main() { int i, n; cin>>n; length_A = n; //init data by random for(i = 1; i <= length_A; i++) { A[i].start = rand() % 100; A[i].end = rand() % 100; if(A[i].start > A[i].end) swap(A[i].start, A[i].end); } divid d = {-1, -1}; Print(d); //sort QuickSort(A, 1, length_A); return 0; }

转载于:https://www.cnblogs.com/windmissing/archive/2012/06/21/2559797.html

标题基于SpringBoot的马术俱乐部管理系统设计与实现AI更换标题第1章引言介绍马术俱乐部管理系统的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述马术俱乐部管理系统对提升俱乐部管理效率的重要性。1.2国内外研究现状分析国内外马术俱乐部管理系统的发展现状及存在的问题。1.3研究方法以及创新点概述本文采用的研究方法,包括SpringBoot框架的应用,以及系统的创新点。第2章相关理论总结和评述与马术俱乐部管理系统相关的现有理论。2.1SpringBoot框架理论介绍SpringBoot框架的基本原理、特点及其在Web开发中的应用。2.2数据库设计理论阐述数据库设计的基本原则、方法以及在管理系统中的应用。2.3马术俱乐部管理理论概述马术俱乐部管理的基本理论,包括会员管理、课程安排等。第3章系统设计详细描述马术俱乐部管理系统的设计方案,包括架构设计、功能模块设计等。3.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的交互方式。3.2功能模块设计详细介绍系统的各个功能模块,如会员管理、课程管理、预约管理等。3.3数据库设计阐述数据库的设计方案,包括表结构、字段设计以及数据关系。第4章系统实现介绍马术俱乐部管理系统的实现过程,包括开发环境、编码实现等。4.1开发环境搭建介绍系统开发所需的环境,包括操作系统、开发工具等。4.2编码实现详细介绍系统各个功能模块的编码实现过程。4.3系统测试与调试阐述系统的测试方法、测试用例以及调试过程。第5章系统应用与分析呈现马术俱乐部管理系统的应用效果,并进行性能分析。5.1系统应用情况介绍系统在马术俱乐部中的实际应用情况。5.2系统性能分析从响应时间、并发处理能力等方面对系统性能进行分析。5.3用户反馈与改进收集用户反馈,提出系统改进建议。第6章结论与展望总结马术俱乐部管理系统的设计与实现成果,并展望未来的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值