是否有用于存储离散间隔的集合
Is there a collection for storing discrete intervals?
我需要将离散范围存储在一个集合中,在插入时连接相邻的范围。STL中是否有已经具有此类功能的结构?
我已经尝试了 boost::intervals,但它很重,对于我正在尝试做的事情来说有点矫枉过正。
例如,假设集合为空,并插入了以下元素:
[64, 96]
[0, 4]
[11, 15]
[5, 10]
间隔集的预期内容应如下所示:
[0, 15]
[64, 96]
您希望
合并间隔以防它们彼此相邻,这一事实使您的任务比建议的间隔树方法容易得多。
相反,您可以使用Some programmer dude
提出的数据结构,并非常快速地推出自己的实现。在这里,我提供了一个可能的实现:
class IntervalSet {
std::map<int, int> _intervals;
public:
void Add(int smaller, int bigger) {
const auto next = _intervals.upper_bound(smaller);
if (next != _intervals.cbegin()) {
const auto prev = std::prev(next);
if (next != _intervals.cend() && next->first <= bigger + 1) {
bigger = next->second;
_intervals.erase(next);
}
if (prev->second + 1 >= smaller) {
smaller = prev->first;
_intervals.erase(prev);
}
}
_intervals[smaller] = bigger;
}
const auto& Intervals() const { return _intervals; }
bool IsInsideInterval(int v) const {
const auto suspectNext = _intervals.upper_bound(v);
const auto suspect = std::prev(suspectNext);
return suspect->first <= v && v <= suspect->second;
}
};
小测试:
IntervalSet is;
is.Add(64, 96);
is.Add(0, 4);
is.Add(11, 15);
is.Add(5, 10);
for (const auto p : is.Intervals()) std::cout << "(" << p.first << ", " << p.second << ") ";
(0, 15( (64, 96(
它也适用于相交间隔:
IntervalSet is;
is.Add(0, 10);
is.Add(5, 15);
is.Add(10, 20);
for (const auto p : is.Intervals()) std::cout << "(" << p.first << ", " << p.second << ") ";
(0,20(
这是一个众所周知的问题。有一个维基百科页面,关于您的问题的可能解决方案。当然,在C++STL中,你可以使用std::map
来实现一个基于朴素方法的解决方案,维基百科中解释过,因为地图是红黑树,是一种二叉搜索树。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 用于循环访问多个集合的数据结构
- 一个类用于集合和字典 (map)
- 是否有用于存储离散间隔的集合
- 除了集合之外,模板还可以用于什么
- 递归函数,用于使用位掩码 c++ 显示集合的所有子集
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 用于访问集合c++的排序子集的数据结构
- 是否可以将.NET并发集合用于X64通信的过程间X32
- 以前这样做过吗?(Monad视图包装用于链操作的c++集合/类型)
- C++中的一个reduce函数(用于许多集合并集)
- 相当于 python 的 set.pop() 用于C++的无序集合
- 当使用std::set_intersection时,该集合用于将值复制到目标集合中
- 一个有索引的集合(用于在向量中有效地删除)
- Lua vs嵌入式Lisp和潜在的其他候选.用于基于集合的数据处理
- 用于在C++中返回集合的接口
- Set_intersection用于两种不同类型的集合
- boost是否有比STL更简单的用于集合操作的数据类型?
- 用于存储大量索引的数据结构,每个索引指向一个集合
- Std::map用于小型稀疏集合