C++:用于高效插入和检索自定义数据的数据结构
C++: Data structure for efficient insertion and retrieval of custom data
我在C++(在Windows上)遇到这种情况,我需要保留一组起始值是唯一的int:对(我们不需要关心这个)。所需的操作包括:
- 插入对
- 检索对 X:这应该返回对 Y,其中 Y 的开始
基本解决方案是简单地保留一组对。对于检索,我们将按顺序迭代要检查的集合。这是 O(n)。
我正在寻找更好的解决方案。我目前看到 2 种候选数据结构:
- 排序向量
- STL 的集合(内部实现为二叉搜索树?
排序向量:优点:可以自定义二进制搜索以支持检索操作。这是O(登录)缺点:如何有效地插入新货币对以保持排序顺序。如何避免O(nlogn)的重新排序成本?
设置:优点:使用标准插入方法轻松插入。这是O(1)?缺点: 如何避免顺序搜索?如何比O(n)做得更好?
感谢您的建议。
我也对任何其他可以有效(第一个标准是速度;第二个是内存)支持上述 2 个操作的结构持开放态度。
目前尚不清楚范围是否可以重叠,但如果不能重叠,那么这应该可以工作。 我已经在测试中提供了一个完整的示例。
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <map>
struct RangeContainer {
typedef std::map<int,int> RangeMap;
typedef std::pair<int,int> Range;
void insert(const Range &range)
{
range_map.insert(range);
}
Range find(const Range &x) const
{
RangeMap::const_iterator iter = range_map.upper_bound(x.second);
if (iter==range_map.begin()) {
return invalidRange();
}
--iter;
Range y = *iter;
if (y.first<x.first && x.second<y.second) {
return y;
}
return invalidRange();
}
static Range invalidRange()
{
return Range(INT_MAX,INT_MIN);
}
RangeMap range_map;
};
static void test1()
{
RangeContainer c;
typedef RangeContainer::Range Range;
c.insert(Range(1,10));
c.insert(Range(20,30));
assert(c.find(Range(-5,-4))==c.invalidRange());
assert(c.find(Range(1,10))==c.invalidRange());
assert(c.find(Range(2,9))==Range(1,10));
assert(c.find(Range(2,10))==c.invalidRange());
assert(c.find(Range(11,19))==c.invalidRange());
assert(c.find(Range(21,29))==Range(20,30));
assert(c.find(Range(20,29))==c.invalidRange());
assert(c.find(Range(21,30))==c.invalidRange());
assert(c.find(Range(35,40))==c.invalidRange());
}
int main(int argc,char **argv)
{
test1();
return EXIT_SUCCESS;
}
相关文章:
- 如何创建从Maya(或类似程序)到虚幻引擎的自定义数据导出插件
- 通过 NIF 从C++返回自定义数据结构
- 我们可以在套接字编程中将自定义数据作为辅助数据发送吗?
- 自定义数据结构的优点是什么?
- 如何在 omnet++ 中发送自定义数据包?
- 错误 - 自定义数据类型作为有效负载,带有提升::几何
- C++哈希表 - 如何解决自定义数据类型作为键的unordered_map冲突?
- 从自定义数据类型向量中删除重复元素
- C++:自定义数据类型向量错误的队列
- C++ - 按自定义数据类型向量的值删除元素
- 通过套接字发送的自定义数据包
- 以面向对象的方式解析自定义数据包
- 异步发送和接收带有提升的自定义数据包?
- 使用算法标头查找自定义数据类型的minmax
- 仅覆盖自定义数据架构的迭代器的操作员*()
- 有没有办法将大小传递给节点(C++自定义数据容器)中的数组
- 如何将自定义数据类型(用std::对填充的std::数组)写入文件流
- 使用算法查找自定义数据向量中的最大值和最小值
- 具有各种访问方法的自定义数据结构
- QT编辑自定义数据结构