编译一组范围索引

我们需要将关于三角形列表中存在或不存在元素的信息编码。

我们将集中关注对只包含属于整数范围的元素的Set(储存非重复元素的容器,最优化用于检测是否存在特定元素)进行编码的同等问题,以解决这一问题:[0]个三角数-1],即三角形列表的索引范围。


目标:使用最小比特数编码本集 。

说明说明

让我们看看这个无关紧要的方法, 在许多情况下,这个方法可能是最佳的:

它将储存:

  • 范围中元素的数量(31位数,因为爪哇的列表限于231-1元素)。
  • 之后为每个指数1位数,标明该元素是否在集中存在。

这是第一个版本的分形图像压缩器, 用来存储来自三角形分割和合并的数据 。

虽然这不是最理想的, 因为随着拆分的迭代进展, 要储存的元素数量减少, 只占总量的很小的百分比, 这样小的编码就可以大大改进。


现在的目标是改进这个微小的编码, 看看是否可以从使用的位数获得一个更压缩的编码 。


第一种办法 :当集中的元素数量大大小于范围大小时,我们可以考虑储存现有的指数。

在这种情况下,使用是:

  • 范围中元素数的 31 位数。
  • 集中元素数的 31 位数 。
  • 31 位元 * 集中的元素数。


第二种办法 我们增加每个存储元素的位数:

  • 区域中元素数的 31 位数 31 位数。区域中最大元素数的位数( numBits 缩写 )将予以计算。
  • 要存储的 5 位数 numBits 缩写 ..所以,如果范围中的元素数量是1023, 10将存储在5位数内。
  • numBits 缩写 位元,以在“设定”中存储元素数。
  • numBits 缩写 位元 * " 设定 " 中包含的元素数。

我们渐渐接近一个更好的编码...


第三近似度 。我们意识到,如果我们按向上顺序对设定进行排序,三角形(连续元素之间的差异)可能会以比数小于幅度绝对值的位数编码:

  • 范围中元素数的 31 位数。
  • 我们计算最小的 numBitsElem 来编码元素 。我们还计算三角洲列表(一组元素排序列表中顺序元素之间的差异列表 ) 。最后,我们还计算 numBits 圆形
  • 要存储的 5 位数 numBits 缩写 ..
  • 要存储的 5 位数 numBits 圆形 ..
  • numBits 缩写 位元,以在“设定”中存储元素数。
  • numBits 圆形 位元 * " 设定 " 中元素的数量。


看来我们已经达到最佳编码了,对吧?

我们继续...

第四近似度 我们集中关注一个事实,即可能有更多的较小的三角洲,也许只有几个更大的三角洲打破了``````````````````。 numBits 圆形 `.'。

在这些条件下,我们可能会发现` nomOptiminumBits 磁盘 `小于上限 ' num maxBits 三角形 `,而后者又小于或等于` numBits 缩写 `.'。

但是,我们如何编码超过`的三角洲元素? nomOptiminumBits 磁盘 ????

既然三角洲永远不会是0(在Set中没有重复元素), 我们可以用值0来表示它是一个特殊值。

之后是0,然后是三角洲的值, 但这次编码为` num maxBits 三角形 `.'。可按以下方式计算比特总数:

  • 范围中元素数的 31 位数 31 位数。我们计算最小的 numBits 缩写 能够编码一个元素。 我们还计算 deltas 列表(《原则和规则》中顺序元素列表的连续元素之间的差异列表 ) 。
  • 31 位元,以存储“一组”中元素的数量。
  • 要存储的 5 位数 nomOptiminumBits 磁盘 ..
  • 要存储的 5 位数 num maxBits 三角形 ..
  • nomOptiminumBits 磁盘 位元 * " 设定 " 中元素的数量。
  • num maxBits 三角形 位数 位数 * 超过的三角形数 nomOptiminumBits 磁盘 ..


我们已经达到最佳编码了吗?

第五近似( 第五近似) 既然我们已经计划好了...我们可以考虑一下互补的情况...能否用同样的算法将成套工具的补全编码, 产生更压缩的结果?

这套材料的补充材料被理解为另一套材料,与原材料脱节,原材料与原材料的结合是整个范围。

也就是说,补充数据集将具有原始数据集所没有的范围的所有要素,而原始数据集中没有这些要素。

美的在于,从一组中,很容易获得补充组,因此,在将补充组编码之后,我们可以获得原始组。

显而易见的应用程序是一组包含除一个或几个以外范围的所有元素的集合。 。 。 。

好吧... 如果我们只储存缺位的(补充组), 它的储存规模会小得多,对吧?

这个案子的编码可能是这样的:

  • 范围中元素数的 31 位数 31 位数。我们计算最小的 numBits 缩写 来编码元素。我们也计算 deltas 列表(《原则和规则》中顺序元素列表的连续元素之间的差异列表) 。
  • 1 位元, 以存储我们是否存储原始集还是补充 。这是额外的部分。
  • 31 位元,以存储“一组”中元素的数量。
  • 要存储的 5 位数 nomOptiminumBits 磁盘 ..
  • 要存储的 5 位数 num maxBits 三角形 ..
  • nomOptiminumBits 磁盘 位元 * " 设定 " 中元素的数量。
  • num maxBits 三角形 位数 位数 * 超过的三角形数 nomOptiminumBits 磁盘 在他们出现的位置。

嗯... 现在我们在聊天了

但我知道,如果所有这些奇迹都能完成, 寻找其他模式,或者仅仅使用一个无损的压缩机, 比如拉链或7z, 无法完成什么。


那得等下 下次在火炉上...

代码描述

解码器是微不足道的... 你只需要读读比特流的参数 并运用必要的动作来获得原始集。


我要集中关注编码器算法, 试图优化操作的数量。

想法是用每种编码预估它所占用的位数, 并保持最佳的比特数 。

因为使用三角洲编码没有意义 如果它最终占用的比小的编码还多的话

所以... 我们算算这个小编码会占用什么

还有... 我们还计算了 上一节所解释的 更精密的三角洲型编码的 最佳参数


这将通过计算参数组合的编码所占用的位数来完成 :

  • nomOptiminumBits 磁盘
  • num maxBits 三角形 这是固定的。
  • 使用原始的或补充的套件。


为了避免在寻找最佳参数方面过于复杂的计算(使用大幅度的参数可能会受到处罚),我们采取以下行动:

补充数据集只计算一次并储存。

原始集和补充集的三角洲清单只计算一次并储存。

要计算由不同参数组合产生的位数 :

我们只计算一次三角洲列表中位数的直方图。 基于此直方图, 计算比特总数很容易, 而这些计算在计算上的复杂程度远低于“ 模拟” 元素元素编码 。


一旦获得三角编码的最佳参数组合,其大小将与小编码的大小进行比较,并选择两种编码中的最佳组合。

下载下载