c++ - 保持排序的数据结构,允许 log N 插入时间,并且可以返回我在 log N 中查找的元素的索引

标签 c++ sorting vector multiset

我想要一个数据结构,我可以在其中插入元素,插入后,它保持排序,并且我在 log N 次中找到刚刚插入的元素的索引。

我尝试过使用 vector 和多重集,但都不能满足这两个要求。

vector :

如果我想找到一个元素的索引,我可以这样做:

using namespace std;
vector<int>::iterator it = lower_bound(myvec.begin(), myvec.end(), someElement);
int index = (it - myvec.begin());

但是, vector 在保持排序的同时不允许插入时间为 O(log N)。每次插入后对 vector 进行排序的时间复杂度为 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<int>::iterator it = lower_bound(myset.begin(), myset.end(), someElement);

使用 lower_bound 后,我不能仅仅这样做

int index = (it - myset.begin());

就像我对 vector 所做的那样。相反,我考虑的一种方法是:

int index = distance(myset.begin(), it);

但是,距离运行的时间为 O(N),而不是 O(log N) 时间。

是否有一种数据结构或方法可以让我在 log N 时间内满足这两个要求?

最佳答案

vector 和多重集都无法达到要求。

能够满足要求的数据结构是平衡二叉搜索树,它通过在节点中存储子树的大小来增强。这种增强搜索树称为“顺序统计树”。

尽管标准库的有序关联容器在内部使用搜索树实现,但标准库没有提供可用于实现此目的的通用树数据结构。

关于c++ - 保持排序的数据结构,允许 log N 插入时间,并且可以返回我在 log N 中查找的元素的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59620791/

相关文章:

c++ - 如何获取蓝牙HID设备的MAC地址?

c++ - epoll反向代理在编写客户端时卡住

javascript - 使用 javascript 对复杂的无序列表进行排序

Linux shell 和排序 -t 和 -k

C++ - 智能指针 vector 图 - 全部继承自同一基类

c++ - 如何从重写的运算符<<迭代 vector 数据成员

c++ - 将可变类型扩展到另一个

c++ - 为什么不能像这样复制 char 数组 charArray ="some string";

python - 按列对csv进行排序

c++ - C++ vector 中的新手