《计算之魂》思考题1.4 - Q2

如果有N个区间[l1, r1], [l2, r2], … ,[lN, rN],只要满足下面的条件我们就说这些区间是有序的:存在 xi∈ [li, ri],其中i = 1, 2, … N。
比如,[1, 4]、[2, 3]和[1.5, 2.5]是有序的,因为我们可以从这三个区间中选择1.1、2.1和2.2三个数。同时[2, 3]、[1, 4]和[1.5, 2.5]也是有序的,因为我们可以选择2.1、2.2和2.4。但是,[1, 2]、[2.7, 3.5]和[1.5, 2.5]不是有序的 。
对于任意一组区间,如何将它们进行排序?

一、破题

题目的要求是对区间进行排序,那么此题的关键就是将题目所给的定义转换为对区间端点的讨论。

二、解题

首先,从仅含有两个区间开始讨论,如果区间 N1 和 N2 可以互换的话,那么有以下两种情况,

图1

N1 的左端点 < N2 的右端点,或者
N1 的右端点 > N2 的左端点

其次是包含三个区间的情况,这里我们不妨先对每个区间的右端点(左端点同理)进行排序,这样的话可以先得到以一组有序区间:

对于区间 N1(a, b), N2(c, d), N3(e, f), 有 b < d < f

图2
这里,我们将三个区间划分成两组进行讨论,

  1. 一组是 N3 ,作为头区间(最大的区间)
  2. 一组是 N1 和 N2

可以得出以下各种情况:
图3至此,我们已经讨论了三个区间的不同排列情况,对于 n 个区间而言,有如下步骤可以递归处理:

  1. 按照右端点排序;
  2. 将右端点最大的区间作为头区间,讨论剩余 n -1 个区间的情况;
  3. 对剩余的 n - 1 个区间按照步骤二重复,直至仅剩 4 个区间为止(也就是右端点最小的四个区间);
  4. 如果第 4 个区间不能和第 3 个区间交换,则按照上图可以得到前三个区间的情况,并递归地讨论第 4 个区间与第 5 个区间是否能交换,直至递归到最后一个区间,算法终止;
  5. 如果能交换,则将第 3 个区间作为最大的区间,并可以得到 N1、N2、N4(按照右端点的相对大小排序)这三个区间的情况,并归位;
  6. 讨论第 4 个区间能否与第 2 个区间交换,不能的话则返回步骤 4;
  7. 能的话则返回步骤 5,直至讨论到第 4 个区间与第 1 个区间是否能交换,并返回步骤4。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值