在Java中存储仅0和1的数组的有效方法

时间:2016-05-24 02:30:59

标签: java arrays bit

在Java中存储1和0数组的最节省空间的方法是什么?

3 个答案:

答案 0 :(得分:4)

我希望你经历过BitSet。我认为这是存储Bits的有效方式。 https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html

但你应该把0视为假,将1视为真

答案 1 :(得分:3)

答案将会有所不同,具体取决于您是否事先知道数组的大小,以及数据的稀疏程度或随机性。

对于初学者来说,如果您正在寻找最有效的存储空间,那么您将需要压缩数据而不是存储原始的0和1。一个通常很好的压缩算法是Huffman Coding,尽管它并不总是最好的#34;特别是如果数据是随机的。您可以找到implementation here

回到原来的问题并假设你想保留原始值;最有效的存储将取决于您是否事先知道阵列的大小。如果它是固定大小,您可以创建许多byte基元。这些中的每一个都将精确地占用1个字节,加上存储它们的对象的开销。您可以根据需要使用shortintlong来将变量数量减少到一起分组2,4或8个字节。如果您将这些变量作为具有其他变量的类的成员包含在内,则可能会对您使用的类型产生影响,因为对象本身需要8个字节用于开销,并且大小始终是8个字节的倍数;所以任何不足的变量都会被填充到多个8字节。

如果你需要一个任意大小的数组(它产生自己的12字节开销,8个用于对象,4个用于数组长度),答案将继续是byte[]的数组,每个数组都是8位映射到1和0的位。但是,JVM以8字节块的形式分配内存,因此1到4个字节将占用int的内存占用,因此byte[]数组最终将匹配short[]的内存占用量。 ,或int[]并且没有真正需要以小于32位的大小分配数组(只要您确保有效地使用所有位。long[]总是最终会占用由于12字节的对象开销和16字节的分配舍入,所以在其他整数数组类型上多出8个字节。

然而,在一天结束时,可读性/可用性可能胜过内存使用。 BitSet将值long[]存储在引擎盖下,并且具有更友好的访问方法,并且可能是最小化(不完全,但实际上足够实用)内存占用的最佳选择。

boolean[]可能是处理CPU的最快速度,但是将内存的8倍作为原始整数类型。

答案 2 :(得分:2)

我认为存储二进制矩阵的最节省空间的方法,如果你有大多数'0'然后'1',则使用sparse matrix。 在稀疏矩阵中,您需要使用交叉列表结构仅表示“1”值。

您可以在GitHub上找到一些实现。