【发布时间】:2012-01-20 21:39:36
【问题描述】:
我有元组列表。每个元组都有一个最小值和最大值。
我想检查提供的列表中是否有任何范围缺失或重叠。
这是定义。
List<Tuple<int, int>> sequences = new List<Tuple<int, int>>();
示例:
1. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(11, 20));
This is fine
2. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(13, 20));
This there are gaps in the sequence
3. sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(10, 20));
This is an overlapping scenario
目前我在做
int minrange = 1;
int maxrange = 20;
var gaps = Enumerable.Range(minrange, maxrange).Where(i => sequences.All(t => t.Item1 > i || t.Item2 < i));
var overlapping = Enumerable.Range(minrange, maxrange).Where(i => sequences.Count(t => t.Item1 <= i && t.Item2 >= i) > 1);
当序列的值为:
minrange = 1;
maxrange = 2097152;
sequences.Add(new Tuple<int, int>(1, 10));
sequences.Add(new Tuple<int, int>(11, 20));
sequences.Add(new Tuple<int, int>(21, 2097152));
在这种情况下,我的 var gaps 返回一个不应该的计数,因为它们是没有间隙或重叠的有效范围
- 这是验证它们的正确方法吗?
- 我做错了什么?
【问题讨论】:
-
您是否需要知道是否有有间隙/重叠,或者您是否需要计算这样的数量?
-
根据您的需要,您可能会发现像 en.wikipedia.org/wiki/Interval_tree 这样的数据结构很有用。
-
@Nate:这正是我想用代码实现的 :)