我想制作“压缩数组”/“压缩向量”类(详情如下),它允许以或多或少的恒定时间进行随机数据访问。
“或多或少恒定时间”意味着虽然元素访问时间不是恒定的,但当我接近数组的某个点时它不应该继续增加。即容器不应该做更多的计算(例如“再次解压缩所有内容以获取最后一个元素”和“几乎什么都不做以获得第一个元素”)来获取一个元素。可以通过将数组拆分为压缩数据块来实现。即访问一个元素应该采取“平均时间”+- 一些偏差。我可以说我希望最好情况下的访问时间和最坏情况下的访问时间相对接近平均访问时间。
我有哪些选择(合适的算法/已经可用的容器——如果有的话)?
集装箱详情:
- 容器充当相同元素的线性数组(例如 std::vector)
- 一旦容器被初始化,数据是不变的,永远不会改变。容器需要提供只读访问。
- 容器的行为应该像 array/std::vector - 即通过 operator[] 访问的值,有 .size() 等。
- 如果我能把它做成模板类就好了。
- 对数据的访问应该或多或少是固定时间的。我不需要每个元素都具有相同的访问时间,但我不应该解压缩所有内容来获取最后一个元素。
使用示例:
对数据进行二分搜索。
数据细节:
1. 数据是结构体,主要由浮点数和一些整数组成。浮点数比整数多。没有字符串。
2.数组中不可能有很多相同的元素,所以简单的索引数据是不可能的。
3. 一个元素的大小小于 100 字节。
4. 每个容器的总数据大小在几千字节到几兆字节之间。
5. 数据不是稀疏的——它是连续的元素块,它们都被分配,没有“空槽”。
与未压缩的数组表示相比,压缩的目标是减少块占用的内存量,同时保持某种合理的读取访问性能,并允许将元素随机访问为数组。即数据应该在内部以压缩形式存储,并且我应该能够访问它(只读),就好像它是 std::vector 或类似容器一样。
想法/意见?