3

假设您有一个 32 位整数列表和一个多重集中的相同 32 位整数集合(允许重复成员的集合)

由于 Sets 不保留顺序,但 List 保留,这是否意味着我们可以用比 List 更少的位对 Multiset 进行编码?

如果是这样,您将如何编码 Multiset?

如果这是真的,还有哪些其他示例不需要保留顺序可以节省位?

注意,我只是以 32 位整数为例。数据类型在编码中是否重要?数据类型是否需要固定长度且具有可比性才能获得节省?

编辑

任何解决方案都应该适用于具有低重复和高重复的集合。很明显,仅通过简单地计算重复来对多集进行高重复编码非常容易,但是如果集合中没有重复,这会占用更多空间。

4

5 回答 5

1

在多重集中,每个条目将是一对数字:整数值,以及它在集中使用的次数的计数。这意味着多重集中每个值的额外重复不再需要存储成本(您只需增加计数器)。

但是(假设两个值都是整数)如果每个列表项平均重复两次或更多次,这只会比简单列表更有效的存储 - 可能有更有效或更高性能的方法来实现这一点,具体取决于范围、稀疏性,并重复存储的数字。(例如,如果您知道任何值的重复次数不会超过 255 次,则可以使用 byte 而不是 int 来存储计数器)

这种方法适用于任何类型的数据,因为您只是存储每个数据项的重复次数。每个数据项都需要具有可比性(但仅限于您知道两个项目相同或不同的程度)。不需要每个项目占用相同数量的存储空间。

于 2010-02-02T18:29:26.790 回答
0

原则上,这相当于对值进行排序并存储第一个条目以及后续条目之间的有序差异。

换句话说,对于一个稀疏的集合,只能节省很少的空间,但是对于一个更密集的集合,或者一个具有聚集条目的集合 - 更重要的压缩是可能的(即每个条目需要存储的位更少,可能少于一个在许多重复的情况下)。即压缩是可能的,但级别取决于实际数据。

于 2010-02-02T20:06:20.173 回答
0

如果多重集中有重复项,则可以将其压缩到比简单列表更小的大小。您可能想看看Run-length encoding,它可用于有效地存储重复项(一种非常简单的算法)。

希望这就是你的意思...

于 2010-02-02T18:29:03.440 回答
0

数据压缩是一个相当复杂的主题,数据中存在难以用于压缩的冗余。

它基本上是临时的,因为缩小某些数据集的无损方案(您可以恢复输入数据的方案)必须扩大其他数据集。具有大量重复的整数集合在多重映射中效果很好,但如果没有重复,则重复计数为 1 时会占用大量空间。您可以通过在不同文件上运行压缩实用程序来测试这一点。文本文件有很多冗余,通常可以压缩很多。随机数文件在压缩时会趋于增长。

我不知道丢失订单信息确实有可利用的优势。这取决于实际数字是多少,主要是是否有很多重复。

于 2010-02-02T18:50:41.093 回答
0

后跟 list delta 的操作排序会产生更容易压缩的序列化形式。

EG [ 2 12 3 9 4 4 0 11 ] -> [ 0 2 3 4 4 9 11 12 ] -> [ 0 2 1 1 0 5 2 1 ],重量大约是其一半。

于 2010-02-24T21:17:42.987 回答