算法实验题2.2 条形图轮廓问题(分治)


题目

在这里插入图片描述


思路

分治,每一个矩形都有一个轮廓图,不妨设它的能代表轮廓线的三个点从左到右存在一张线性表中,当有两个矩形要求其轮廓线一共分为以下几种情况:

  • 两个矩形没有交集,靠左的矩形的右边界小于靠右矩形的左边界,即 R l < L r R_l<L_r Rl<Lr
  • 两个矩形边相切,靠左的矩形的右边界等于靠右矩形的左边界,即 R l = = L r R_l==L_r Rl==Lr
  • 两个矩形边相交,靠左的矩形的右边界大于靠右矩形的左边界,即 R l > L r R_l>L_r Rl>Lr
  • 两个矩形边内含,即在相交的基础上 R l < L l R_l<L_l Rl<Ll

    关于上述操作,1,2两点直接push_back即可,而对于3,4则是要在两个的交集域中再次更新轮廓线的高度以及某小段的宽度,于是根据上述逻辑,两个轮廓线的合并操作也一致。

    于是我们可以利用分治,把整个区间不断均分成两份,当区间剩1份矩形使直接返回这个矩形的轮廓线;当区间剩2份矩形时返回他们合并后的轮廓线;否则继续平分。

    复杂度分析: T ( n ) = 2 ∗ T ( n / 2 ) + n T(n)=2*T(n/2)+n T(n)=2T(n/2)+n,平均复杂度为: O ( n ∗ l o g 2 n ) O(n*log2^n) O(nlog2n)

伪代码

LinkList<int> Divide(RectList arr[], int l, int r) {
	if(r == l) return make_profile(arr[l]);
	if(r == l+1) return make_profile(merge(arr[l], arr[r]));
	int mid = l + (r - l >> 1); //中点
	return make_profile(merge(Divide(arr, l, mid), Divide(arr, mid+1, r)));
}

博文推荐:
https://www.cnblogs.com/andyzeng/p/3683498.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小胡同的诗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值