【发布时间】:2017-08-23 19:40:12
【问题描述】:
我在一个数组中有一组范围。例如(但请注意,我的范围集将大于此):
static const Section arr[] = {
{
.start_addr = 0,
.length = 100,
},
{
.start_addr = 150,
.length = 25,
},
{
.start_addr = 175,
.length = 25,
},
...
}
数据不一定是排序的,类型都会是整数类型。此外,地址永远不会是负数,因此可以是uint32_t。
然后我想通过如下函数查询另一个范围是否包含在所有这些范围的联合中:
bool isEncapsulated(uint32_t addr, size_t len){
// Here I need some sort of algorithm to determine whether
// it is fully encapsulated.
}
我遇到的主要困难是找到一种方法来解释提供的范围可能超出两个定义范围的边界这一事实。例如。如果start_addr = 170, length = 10 落在两个已定义范围的边界上。
有没有优雅的方法来实现这一点?
编辑:
Here's 我正在尝试做的图形描述。本质上,范围 1、2、3 是我将在我的数组中定义的范围。然后,我将询问是否将任何范围 A-F 封装在其中。所以,D 和 E 是仅有的两个不是。我不只是想要重叠,我希望范围完全包含在预定义的范围内。
【问题讨论】:
-
这是“重叠间隔”算法或其变体。谷歌一下。
-
如果
addr和len是相同类型或至少是相同的sign-ness,则portable 答案会更容易。否则int/size_t有很多极端情况。 -
arr中的数据是按起始地址可靠排序的,还是只是在样本数据中巧合排序?数据中的任何范围是否重叠,或者它们是否都是不相交的,即使某些范围是相邻的?同样,样本数据暗示“完全不相交”,但这可能会产生误导。这些类型是整数类型,所以我们不必处理浮点问题吗?这些问题的答案会严重影响可能的算法。 -
@JonathanLeffler 数据不一定是排序的,类型都会是整数类型。另外,地址永远不会是负数,所以可以是
uint32_t,我的错。 -
@chux
start_addr = 170, length = 10应该返回true,因为.start_addr = 150, ... .start_addr = 175这两个部分将完全包含它。
标签: c