这是不可理解的。我会改写
是否有算法或方法允许对数组进行排序,以最大限度地减少连续元素之间的差异?
struct element
{
uint32 positions[8];
}
这些记录对顺序不敏感 输出文件格式定义为:
byte present; // each bit indicating whether position[i] is present
uint32 position0;
-- (only bits set in Present are actually written in the file).
uint32 positionN; // N is the bitcount of "present"
byte nextpresent;
保证所有记录都是唯一的,因此0的“当前”字节表示EOF。 通过使用当前字段更新“当前”结构来解析文件,并将结果添加到列表中。
例如:{1,2,3},{2,3,2},{4,2,3}
将是:111b 1 2 3 001b 4 111b 2 3 2
从未排序的方法中保存2个数字。
我的目标是最小化输出文件大小。
答案 0 :(得分:5)
我认为这个问题应该用'压缩'来标记。
据我了解,你有无序记录,包括8个4字节整数:总共32个字节。您希望以最小文件大小存储这些记录,并决定使用基于delta encoding的某种形式的Hamming distance。您正在询问如何为您构建的压缩方案对数据进行最佳排序。
从你告诉我们的内容来看,我没有看到你按照你所描述的方式分割32个字节的真正原因(除了字边界很方便)!如果你得到相同的数据,你真的在乎它是否被编码为8个4字节,或16个2字节,或者是一个巨大的32字节整数?
此外,除非问题领域的某些内容使您的方法成为最喜欢的,否则最好的选择可能是使用tried-and-tested compression scheme。您应该能够找到已编写的代码,并且您将获得典型数据的良好性能。
回到原来的问题,如果你真的想采取这条路线。很容易想象选择一个起始记录(我认为它不会产生太大的差别,但选择'最小'或'最大'可能是有意义的),并计算汉明距离到所有其他记录。然后,您可以选择具有最小存储距离的那个,然后重复。显然这是记录数量的O(n ^ 2)。不幸的是,this paper(我没有详细阅读或理解)使得计算从一个字符串到一组其他字符串的最小汉明距离本质上很难,并且没有非常好的近似值。 / p>
通过基于Hamming weight(归结为该32字节整数的总体数)对记录进行排序,显然可以获得更好的复杂性,其中O(n log(n))的数量为记录。然后对结果使用一些差异编码。但我不认为这会产生一个非常好的压缩方案:从0到7的整数可能最终会像:
000,100,010,001,101,011,110,111
0,4,2,1,5,3,6,7
这让我们回到之前提出的问题:你确定你的压缩方案比你的特定数据的标准更好吗?
答案 1 :(得分:1)
您正在查看一对子问题,定义结构之间的差异,然后排序。
我对结构的描述以及差异的优先级并不十分清楚,但我会假设您可以解决这个问题并计算两个实例之间的差异分数。对于文件,有用于讨论这些内容的已知算法,例如diff中使用的算法。
对于您的订购,您正在寻找经典的travelling salesman problem。如果你正在整理其中的一些东西,那很简单。如果你要对它们进行分类,那么你必须满足于“足够好”的类型,除非你准备好应用领域知识和TSP的许多小技巧。