对于如此少量的位,如Glorfindel所指出的那样,保存许多位是不可行的。但是,如果您使用的域多了一些位,则可以通过使用起始值和增量对范围进行编码,从而在平均情况下节省大量成本。
假设域是整数,即32位。使用幼稚的方法,您需要64位(开始,结束)来存储范围。
如果我们切换到(start,delta)的编码,则可以从中构造范围的结尾。我们知道在最坏的情况下,起始值为0,增量为32位。
2 ^ 5是32,因此我们将增量的长度编码为五位(无零长度,始终加1),编码变为(开始,长度,增量)。在最坏的情况下,这需要花费32 * 2 + 5位,因此需要69位。因此,在最坏的情况下,如果所有范围都很长,则天真编码会更糟。
在最佳情况下,它的成本为32 + 5 + 1 = 38位。
这意味着,如果您必须对很多范围进行编码,而每个范围仅覆盖您网域的一小部分,那么使用这种编码方式最终平均会占用较少的空间。起始位置的分配方式无关紧要,因为起始位置将始终占用32位,但是范围长度的分配方式也很重要。如果长度越小,压缩效果越好,则覆盖整个域长度的范围越多,这种编码的效果就越差。
但是,如果您有许多范围围绕相似的起点分组(例如,因为您从传感器获取值),则可以实现更大的节省。您可以对起始值应用相同的技术,并使用偏差来抵消起始值。
假设您有10000个范围。范围围绕某个值分组。您可以使用32位对偏差进行编码。
使用幼稚的方法,您将需要32 * 2 * 10000 = 640 000位来存储所有这些范围。
对偏置进行编码需要32位,而在最佳情况下对每个范围进行编码则需要5 +1 + 5 +1 = 12位,总共120000 + 32 = 120032位。在最坏的情况下,您需要5 + 32 + 5 + 32位,即74位,总共需要740 032位。
这意味着,对于需要32位编码的域上的10000个值,我们得到
- 最佳情况下具有智能增量编码的120032位
- 始终使用天真的开始,结束编码的640 000位(无最佳或最差情况)
- 740 032位,在最坏的情况下使用智能增量编码
如果您将朴素的编码作为基准,则意味着最多可节省81.25%或节省15.625%。
根据您的价值分配方式,这些节省是可观的。了解您的业务领域!知道要编码的内容。
作为扩展,您还可以更改偏差。如果您分析数据并确定值组,则可以将数据分类到存储桶中,并根据其自身的偏见分别对每个存储桶进行编码。这意味着您不仅可以将这种技术应用于围绕单个起始值分组的范围,而且还可以应用于针对多个值分组的范围。
如果您的起点分布均匀,那么这种编码实际上就不能很好地工作。
这种编码显然很难索引。您不能简单地读取第x个值。它几乎只能顺序读取。这在某些情况下是适当的,例如,通过网络或大容量存储(例如,在磁带或HDD上)进行流传输。
评估数据,将其分组并选择正确的偏差可能是一项艰巨的工作,可能需要进行一些微调才能获得最佳结果。