区间 模糊排序
来源:互联网 发布:淘宝商城羊毛衫 编辑:程序博客网 时间:2024/06/06 01:07
问题描述
a) 为n个区间的模糊排序设计一个算法。你的算法应该具有算法的一般结构,它可以快速排序左部端点(即各a(i)),也要能充分利用重叠区间来改善运行时间。(随着各区间重叠得越来越多,对各区间进行模糊排序的问题会变得越来越容易。你的算法应能充分利用这种重叠。)
b) 证明:在一般情况下,你的算法的期望运行时间为Θ(nlgn),但当所有的区间都重叠时,期望的运行时间为Θ(n)(亦即,当存在一个值x,使得对所有的i,都有x∈[a(i), b(i)])。你的算法不应显式地检查这种情况,而是应随着重叠量的增加,性能自然地有所改善。
/**
* FuzzySort.cpp
* @Author Tu Yongce <yongce (at) 126 (dot) com>
* @Created 2008-2-26
* @Modified 2008-2-26
* @Version 0.1
*/
// 《算法导论》(第二版)P164,思考题7-6:对区间的模糊排序
/**
* 考虑这样的一种排序问题,即无法准确地知道待排序的各个数字到底是多少。对于其中的每个数字,
* 我们只知道它落在实轴上的某个区间内。亦即,给定的是n个形如[a(i), b(i)]的闭区间(这里小括
* 后起下标的作用,后同),其中a(i) <= b(i)。算法的目标是对这些区间进行模糊排序
* (fuzzy-sort),亦即,产生各区间的一个排列<i(1), i(2), ..., i(n)>,使得存在一个c(j)属于
* 区间[a(i(j)), b(i(j))],满足c(1) <= c(2) <= c(3) <= ... <= c(n)。
* a) 为n个区间的模糊排序设计一个算法。你的算法应该具有算法的一般结构,它可以快速排序左部
* 端点(即各a(i)),也要能充分利用重叠区间来改善运行时间。(随着各区间重叠得越来越多,
* 对各区间进行模糊排序的问题会变得越来越容易。你的算法应能充分利用这种重叠。)
* b) 证明:在一般情况下,你的算法的期望运行时间为Θ(nlgn),但当所有的区间都重叠时,期望的
* 运行时间为Θ(n)(亦即,当存在一个值x,使得对所有的i,都有x∈[a(i), b(i)])。你的算法
* 不应显式地检查这种情况,而是应随着重叠量的增加,性能自然地有所改善。
*/
#include <iostream>
#include <utility>
using namespace std;
typedef pair<int, int> pair_int;
template <typename T>
pair_int fuzzy_partition(pair<T, T> *arr, int p, int r)
{
// 类似快速排序的划分,arr[i..k-1]范围内的区间元素有共同的重叠区间,该重叠区间作为主元
// 时间复杂度为O(n)
int i = p, k = p + 1, j = r;
pair<T, T> x = arr[p]; // 主元区间
while (k <= j) {
if (arr[k].second < x.first) {
// 比主元区间小
swap(arr[k], arr[i]);
++i;
++k;
} else if (arr[k].first > x.second) {
// 比主元区间大
swap(arr[k], arr[j]);
--j;
} else {
// 与主元区间有重叠,则更新主元为重叠区间(交集)
x.first = max(x.first, arr[k].first);
x.second = min(x.second, arr[k].second);
++k;
}
}
return pair_int(i, j);
}
template <typename T>
void fuzzy_sort(pair<T, T> *arr, int p, int r)
{
// 对区间的模糊排序,类似于快速排序算法
if (p < r) {
pair_int q = fuzzy_partition(arr, p, r);
fuzzy_sort(arr, p, q.first - 1);
fuzzy_sort(arr, q.second + 1, r);
}
}
void fuzzy_sort_test()
{
pair_int arr1[] = {pair_int(7, 9), pair_int(2, 5)};
pair_int arr2[] = {pair_int(4, 8), pair_int(2, 5)};
pair_int arr3[] = {pair_int(5, 9), pair_int(2, 7), pair_int(4, 8), pair_int(3, 6)};
pair_int arr4[] = {pair_int(7, 9), pair_int(9, 10), pair_int(2, 5), pair_int(4, 8), pair_int(1, 10)};
pair_int arr5[] = {pair_int(1, 2), pair_int(2, 3), pair_int(3, 4), pair_int(4, 5), pair_int(5, 6)};
pair_int *arr[] = {arr1, arr2, arr3, arr4, arr5};
const size_t NUM2[] = {
sizeof(arr1) / sizeof(arr1[0]),
sizeof(arr2) / sizeof(arr2[0]),
sizeof(arr3) / sizeof(arr3[0]),
sizeof(arr4) / sizeof(arr4[0]),
sizeof(arr5) / sizeof(arr5[0]),
};
const size_t NUM = sizeof(arr) / sizeof(arr[0]);
for (size_t i = 0; i < NUM; ++i) {
cout << "初始区间序列:" << endl;
for (size_t j = 0; j < NUM2[i]; ++j)
cout << "(" << arr[i][j].first << "," << arr[i][j].second << ") ";
cout << endl;
fuzzy_sort(arr[i], 0, NUM2[i] - 1);
cout << "模糊排序后的区间序列:" << endl;
for (size_t j = 0; j < NUM2[i]; ++j)
cout << "(" << arr[i][j].first << "," << arr[i][j].second << ") ";
cout << "/n" << endl;
}
}
算法运行结果如下:
初始区间序列:
(7,9) (2,5)
模糊排序后的区间序列:
(2,5) (7,9)
初始区间序列:
(4,8) (2,5)
模糊排序后的区间序列:
(4,8) (2,5)
初始区间序列:
(5,9) (2,7) (4,8) (3,6)
模糊排序后的区间序列:
(5,9) (2,7) (4,8) (3,6)
初始区间序列:
(7,9) (9,10) (2,5) (4,8) (1,10)
模糊排序后的区间序列:
(2,5) (4,8) (7,9) (9,10) (1,10)
初始区间序列:
(1,2) (2,3) (3,4) (4,5) (5,6)
模糊排序后的区间序列:
(1,2) (2,3) (3,4) (5,6) (4,5)
- 区间模糊排序
- 区间 模糊排序
- 区间模糊排序
- 对区间的模糊排序
- 对区间的模糊排序
- 快速排序.对区间的模糊排序
- 算法导论 思考题7_2 对区间的模糊排序
- 算法导论 7-6 对区间的模糊排序
- 算法导论-7-6 对区间的模糊排序
- 算法导论7.6对区间的模糊排序
- 算法导论-7-6 对区间的模糊排序
- 第七章快速排序之“区间模糊排序FUZZY-SORT”(待改进。。。)
- 区间模糊排序,给出对应点集,并统计对应点所落在的区间的次数
- 算法导论第7章课后题(对区间的模糊排序)
- Oracle存储过程(分页、模糊查找、排序、按字段区间查找)etc.以及JAVA代码
- (p106)对区间的模糊排序(将相同元素挤在一起的快排)
- 对区间的模糊排序(原题算法导论第三版思考题7-6)
- mybatis模糊查询、区间查询
- 第3章 栈和队列
- 编译、安装boost(on Windows and Solaris)
- dynamic_cast用法
- 快速排序 优化 详细分析
- 对于最大常数为n的队列,进队出现溢出,问此时队列中的元素个数有多少个?为什么?
- 区间 模糊排序
- C++中的四种强制转换 dynamic_case,const_cast,static_case,reinterprer_case的不同
- 构建企业级项目管理体系(06)-PMO是否需要参与项目选择?
- listfile.exe 用正则表达式来找文件
- symbian常用转换
- 中国软件落后微电子产业发展
- RHEL 5 vsftpd 下简单设置多个虚拟用户使用一个目录
- 静态邻接表
- ACM-ICPC必备之 线段树