关联/随机访问容器
associative / random access container
我正在寻找一种数据结构来保存唯一元素的无序集合,这将支持以下操作
- 插入/删除集合中任何位置的元素
- 查询元素是否存在
- 访问随机元素
天真地,1 和 2 建议使用关联容器,例如 unordered_set
,但 3 在元素数量上是线性的。使用随机访问容器,例如 vector
,使 3 变得容易,1 可以在 O(1) 中完成,但随后 2 又是 O(N)。
问题是是否有一种已知的方法可以解决这种线性复杂性?
编辑:通过 3 中的随机元素,我的意思是:给定 N 个元素的任意顺序,检索元素编号j
其中j
介于 0 和 N-1 之间。对于std::vector
来说,它只是下标,对于std::list
或std::set
,它从begin()
开始递增列表/设置迭代器 j 次等。
最适合您的任务的标准容器是 - 就像你说的,vector
1. 和 2. 在 O(n) 和 3. 在 O(1) 中,set
在 1. 和 2. 在 O(log n) 和 3. 在 O(n) 中。根据数据结构的大小,算法复杂性并不那么重要。vector
具有数据局部性的额外优势,因此可以更好地利用 CPU 缓存。
如果元素的实际顺序无关紧要,则可以在摊销的 O(1) (push_back
) 中插入vector
,如果您swap
要删除的元素与最后一个元素一起删除该元素,则可以在摊销 O(1) 中进行删除。
如果你真的有一个大数据结构,你可以使用Boost.Multi-Index来构建一个数据结构,其中1.是O(n),2.是O(log n),3.是O(1)。但是,就像我说的,如果你的数据结构不是很大,vector
应该就可以了。
如果随机存取索引中的顺序无关紧要,则可以在摊销的 O(log n) (push_back
中插入。对于删除,您不能使用swap
技巧,因为这会使其他索引无效。
我一直在寻找这样的数据结构很长时间。
最近,我发现了非常有前途的库,它具有您正在寻找的所有功能。
参见 cntree::set with random access in O(log n)。
这是链接。http://dl.dropbox.com/u/8437476/works/countertree/index.html
虽然它似乎正在开发中,但我认为它非常有用。
根据您对 #3 的需求,std::unordered_set
可能非常合适。
我正在寻找具有上述属性的容器,以便我可以迭代所有类似于for(int i = 0; i < myset.size(); ++i) process(myset[i]);
的元素。我找到了这个页面,它描述了std::unordered_set::bucket_count()
,std::unordered_set::begin(size_t bucket_number)
和std::unordered_set::end(size_t bucket_number)
。
如果您有 OpenMP 循环,这将变得非常方便,因此您可以编写:
std::unordered_set<Element> myset;
#pragma omp parallel for
for(int i = 0; i < myset.bucket_count(); ++i) {
for(auto it = myset.begin(i); it != myset.end(i); ++it)
processElement(*it);
}
这仍然不允许您直接访问myset[i]
,但它非常接近,因为您可以访问编号存储桶中的元素。
std::unordered_set
. 如果使用索引j
作为键,则访问元素不是 O(N),它是 O(1)。
如果您有一个要用于查找的唯一索引并且您不关心其他排序,那么您还计划使用什么作为关联容器的键?
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 一种有效的数据结构,用于按 ID 访问和查找加权随机项
- 如何为我的容器实现随机访问迭代器?
- 对于C++随机访问迭代器(矢量迭代器),迭代器之间的差异是如何计算的?
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- 访问随机图像像素的快速方法,最多一次
- 用于随机数据访问的最有效文件类型
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 随机访问迭代器:我错过了什么?
- 更快地访问 C++ 数组中的随机元素
- 随机访问元组向量中的元组值
- 有没有办法在C++中制作无锁"counter"随机访问迭代器?
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- 如何确保函数模板的参数是随机访问迭代器
- C++基于现有随机访问迭代器的反向迭代器
- C++ 写入随机访问文件
- 我是否可以在C++程序之外使用随机内存地址访问随机数据