gpt4 book ai didi

C++:用于高效插入和检索自定义数据的数据结构

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:10 26 4
gpt4 key购买 nike

我在 C++(在 Windows 上)中遇到一种情况,我需要保留一对 int: 对,其中 start 值是唯一的(我们不需要关心这个)。所需的操作是:

  • 插入对
  • 检索对 X:这应该返回对 Y,其中 Y 的开始 < X 的开始 < X 的结束 < Y 的结束。如果 Y 不存在,则返回 false。

基本的解决方案是简单地保留一组对。对于检索,我们将依次遍历要检查的集合。这是 O(n)。

我正在寻找更好的解决方案。我目前看到 2 个候选数据结构:

  1. 排序的 vector
  2. STL 的集合(内部实现为二叉搜索树?)

排序 vector :优点:可以自定义二分查找来支持检索操作。这是 O(logn)缺点:如何有效地插入新对以维护排序顺序。如何避免 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;
}

关于C++:用于高效插入和检索自定义数据的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202275/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com