保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
Data structure that stays sorted, allows log N insertion time, and can return the index of an element that I look for in log N
>我想要一个数据结构,我将元素插入其中,并且在插入后,它保持排序,我找到我刚刚在log N时间插入的元素的索引。
我尝试使用向量和多重集,但都不能满足这两个要求。
向量:
如果我想找到一个元素的索引,我可以做:
using namespace std;
vector<int>::iterator it = lower_bound(myvec.begin(), myvec.end(), someElement);
int index = (it - myvec.begin());
但是,向量不允许在保持排序的同时进行 O(log N( 插入时间。每次插入后对向量进行排序将是 O(N log N(。我试过了:
vector<int>::iterator it = lower_bound(myvec.begin(), myvec.end(), someElement);
myvec.insert(it, someElement);
这将找到插入元素的正确位置,但myvec.insert在O(N(时间而不是O(log N(时间运行。
多集:
multiset 允许我插入并保持排序,但它缺乏的地方是在插入后获取元素的索引。
multiset<int>::iterator it = lower_bound(myset.begin(), myset.end(), someElement);
使用lower_bound后,我不能仅仅做
int index = (it - myset.begin());
就像我对矢量一样。相反,我考虑的一种方法是:
int index = distance(myset.begin(), it);
但是,距离在 O(N( 时间而不是 O(log N( 时间上运行。
是否有一种数据结构或方法允许我在log N时间内同时满足这两个要求?
向量和多重集都无法满足要求。
满足要求的数据结构是平衡的二叉搜索树,通过在节点中存储子树的大小来增强。这种增强搜索树称为"订单统计树"。
尽管标准库的有序关联容器是使用搜索树在内部实现的,但标准库不提供可用于实现此目的的通用树数据结构。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- 如何用数字处理log(0)
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- 当我使用该功能时,"错误 ld 返回 1 个退出状态"boost::log::add_file_log()"
- 如何写函数整洁?考虑到log,一次返回,不再缩进