算法导论-14.3-7-O(nlgn)时间求矩形集合中重叠矩形的个数

这篇博客介绍了如何在O(nlgn)的时间复杂度内,通过红黑树扩展成区间树来计算矩形集合中重叠矩形的数量。首先对矩形的左右边界进行排序,并记录归属,然后遍历排序结果,对于每个边界,更新区间树以统计重叠情况。
摘要由CSDN通过智能技术生成

一、题目



二、思考

采用红黑树作为基础数据结构,扩展为14.3中的区间树。

第一步:

对每个矩形的左边x和右边x排序,排序结果放在一个序列中。并记录每个x值属于哪个矩形。

如三个矩形的x区间(左边x,右边x)分别是(1,3),(2,4),(3,5),排序结果(x值,属于哪个矩形)是(1,1),(2,2),(3,1),(3,3),(4,2),(5,3)。

第二步:

依次处理排序结果(x,i)。

(1)如果x是矩形i的左边x,则求出区间树中与矩形i的y区间相交的区间个数,再把矩形i的y区间插入到区间树中。

(2)如果x是矩形i的右边x,则将矩形i的y区间从区间树中删除


三、代码

#include <iostream>
#include <algorithm>
using namespace std;

#define BLACK 0
#define RED 1
#define N 10//矩形的个数
//区间结构
struct interval
{
	int low;
	int high;
	interval(){};
	interval(int l, int h):low(l), high(h){}
	bool operator==(interval &b)
	{
		if(low == b.low && high == b.high)
			return 1;
		return 0;
	}
};
//矩形结构
struct Rectangle
{
	interval x;
	interval y;
};
//用于排序
struct Sort_Node
{
	int x;
	int id;//x所属的矩形的编号
	Sort_Node(){}
	Sort_Node(int a, int b):x(a),id(b){}
};
//用于排序
bool cmp(Sort_Node a, Sort_Node b)
{
	return a.x < b.x;
}
//区间树结点结构
struct node
{
	node *left;
	node *right;
	node *p;
	bool color;
	interval inte;//仅存储矩形的y区间
	int max;
	node(node *init, interval i):left(init),right(init),p(init),inte(i),max(i.high),color(BLACK){}
};
//区间树结构
struct Interval_Tree
{
	node *root;//根结点
	node *nil;//哨兵
	Interval_Tree(){nil = new node(NULL, interval(0,-0x7fffffff));root = nil;};
};
//a和b是否重叠,若重叠,返回1
bool Overlap(interval a, interval b)
{
	//a在b的左边
	if(a.high < b.low)
		return 0;
	//a在b的右边
	if(a.low > b.high)
		return 0;
	return 1;
}
//用于维护信息
int max(int a,int b,int c)
{
	if(a > b)
		return a > c ?  a : c;
	else
		return b > c ? b : c;
}
//用于维护信息
int Maintaining(node *z)
{
	if(z->inte.low > z->inte.high)
		return 0;
	return max(z->inte.high, z->left->max, z->right->max);
}
//搜索一个区间
node *Interval_Search(Interval_Tree *T, interval i)
{
	//从根结点开始
	node *x = T->root;
	//不是叶子且不重叠
	while(x != T->nil && !Overlap(i, x
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值