c – 具有随机数据访问的压缩向量/数组类

我想制作“压缩数组”/“压缩向量”类(下面的细节),允许随机数据访问或多或少的恒定时间.

“或多或少的恒定时间”意味着虽然元素访问时间不是恒定的,但是当我接近数组的某个点时,它不应该保持增加.即容器不应该做更多的计算(如“再次解压缩所有的东西以获得最后一个元素”,并且“几乎没有什么可以获得第一个”)来获取一个元素.可以通过将数组拆分成大量的压缩数据来实现.即访问一个元素应该采取“平均时间” – 一些偏差.我可以说,我想要最好的访问时间和最坏的访问时间相对接近平均访问时间.

我有什么选择(合适的算法/已经可用的容器 – 如果有的话)?

集装箱细节:

>容器作为一个相同元素的线性数组(如std :: vector)
>一旦容器初始化,数据是恒定的,永远不会改变.容器需要提供只读访问.
>容器应该像array / std :: vector这样的行为,即通过operator []访问的值,有.size()等.
>如果我可以将其作为模板类,这将是很好的
>访问数据应该是或多或少的恒定时间.我不需要每个元素的访问时间相同,但是我不需要解压缩所有内容获取最后一个元素.

用法示例:
二进制搜索数据.

资料详情:
数据是主要由浮点数和几个int组成的结构体.有比浮点数更多的浮点数.没有字符串
在阵列中不太可能有相同的元素,所以只能索引数据是不可能的.
一个元素的大小小于100字节.
4.每个容器的总数据大小在几千字节和几兆字节之间.
数据不稀疏 – 它是连续的元素块,它们都被分配,没有“空槽”.

压缩的目的是减少与未压缩表示作为数组相比的块所需的RAM数量,同时保持一些合理的读取访问性能,并允许随机访问元素作为数组.即数据应该以内部的压缩形式存储,我应该能够访问它(只读),就像它是一个std :: vector或类似容器一样.

想法/意见?

解决方法

我认为,你想要一个数组,其元素不是存储的,而是被压缩,以最小化内存使用.

关于压缩,您对数据的结构没有任何特别的了解,因此您可以使用某种标准熵编码.理想情况下,想要在整个阵列上运行GZIP并完成它,但是会丢失O(1)访问,这对您至关重要.

一个解决方案是使用Huffmann coding和索引表.

霍夫曼编码通过用可变位长度的另一个符号替换每个输入符号(例如,ASCII字节),取决于整个流中的发生频率.例如,字符E经常出现,所以它得到一个短的序列,而’W’很少得到一个很长的序列.

E -> 0b10
W -> 0b11110

现在,用这种方法压缩整个数组.不幸的是,由于输出符号具有可变长度,因此您可能不再像以前一样索引数据:项目号15不再在流[15 * sizeof(item)].

幸运的是,这个问题可以通过使用附加的索引表索引来解决,该索引存储在压缩流中每个项目开始的位置.换句话说,项目15的压缩数据可以在stream [index [15]]找到;索引表累加变量输出长度.

所以,要获得项目15,你只需要在stream [index [15]]开始解压缩字节.这是因为霍夫曼编码对输出不做任何奇怪的事情,它只是连接新的代码字,你可以在流内开始解码,而无需解码所有以前的项目.

当然,索引表增加了一些开销;您可能需要调整粒度,使压缩数据索引表仍然小于原始数据.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...