在 Java 中存储仅包含 0 和 1 的数组的有效方法
Efficient way to store an array of only 0s and 1s in Java
在 Java 中存储 1 和 0 数组的最space 有效方法是什么?
答案会有所不同,具体取决于您是否事先知道数组的大小,以及数据的稀疏程度或随机程度。
对于初学者来说,如果您正在寻找最高效的存储,您将希望压缩数据而不是存储原始的 0 和 1。一种典型的好的压缩算法是 Huffman Coding, although it is not always the "best" particularly if the data is random. You can find an implementation here.
回到最初的问题,假设您想保留原始值;最有效的存储将取决于您是否提前知道数组的大小。如果是固定大小,可以创建多个byte
个图元。这些中的每一个都将占用 1 个字节,加上存储它们的对象的开销。您可以根据需要使用 short
、int
或 long
将 2、4 或 8 个字节组合在一起,从而减少变量的数量。如果您将这些变量作为 class 的成员与其他变量一起包括在内,您使用的类型可能会有所不同,因为对象本身需要 8 个字节的开销,并且大小始终是以下的倍数8个字节;所以任何短的变量都将被填充到多个 8 字节。
如果您需要一个任意大小的数组(它会产生自己的 12 字节开销,8 个用于对象,4 个用于数组长度)答案将继续是一个 byte[]
的数组,其中每个映射到您的 1 和 0 的 8 位。但是,JVM 以 8 字节块的形式分配内存,因此 1 到 4 个字节将占据 int
的内存占用空间,因此 byte[]
数组最终将匹配 short[]
的内存占用空间,或 int[]
并且没有真正需要分配小于 32 位的数组(只要您确保有效地使用所有位。 long[]
最终总是会占用额外的 8 个字节由于 12 字节对象开销和 16 字节分配舍入,优于其他整数数组类型。
然而,在一天结束时,readability/usability 可能胜过内存使用。 BitSet
在后台将值存储为 long[]
并且具有更友好的访问方法,并且可能是此处最小化(不完全是,但对于实际目的来说足够好)内存占用的最佳选择。
A boolean[]
可能是处理 CPU 最快的方法,但作为原始整数类型需要 8 倍的内存。
希望你已经通过了BitSet
。我认为这是存储位的有效方式。
https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
但您应该将 0 视为假,将 1 视为真
我认为存储二进制矩阵最 space 最有效的方法是使用 sparse matrix,如果你有最多的 '0' 然后 '1'。
在稀疏矩阵中,您只需要使用交叉列表结构表示“1”值。
您可以在 GitHub 上找到一些实现。
在 Java 中存储 1 和 0 数组的最space 有效方法是什么?
答案会有所不同,具体取决于您是否事先知道数组的大小,以及数据的稀疏程度或随机程度。
对于初学者来说,如果您正在寻找最高效的存储,您将希望压缩数据而不是存储原始的 0 和 1。一种典型的好的压缩算法是 Huffman Coding, although it is not always the "best" particularly if the data is random. You can find an implementation here.
回到最初的问题,假设您想保留原始值;最有效的存储将取决于您是否提前知道数组的大小。如果是固定大小,可以创建多个byte
个图元。这些中的每一个都将占用 1 个字节,加上存储它们的对象的开销。您可以根据需要使用 short
、int
或 long
将 2、4 或 8 个字节组合在一起,从而减少变量的数量。如果您将这些变量作为 class 的成员与其他变量一起包括在内,您使用的类型可能会有所不同,因为对象本身需要 8 个字节的开销,并且大小始终是以下的倍数8个字节;所以任何短的变量都将被填充到多个 8 字节。
如果您需要一个任意大小的数组(它会产生自己的 12 字节开销,8 个用于对象,4 个用于数组长度)答案将继续是一个 byte[]
的数组,其中每个映射到您的 1 和 0 的 8 位。但是,JVM 以 8 字节块的形式分配内存,因此 1 到 4 个字节将占据 int
的内存占用空间,因此 byte[]
数组最终将匹配 short[]
的内存占用空间,或 int[]
并且没有真正需要分配小于 32 位的数组(只要您确保有效地使用所有位。 long[]
最终总是会占用额外的 8 个字节由于 12 字节对象开销和 16 字节分配舍入,优于其他整数数组类型。
然而,在一天结束时,readability/usability 可能胜过内存使用。 BitSet
在后台将值存储为 long[]
并且具有更友好的访问方法,并且可能是此处最小化(不完全是,但对于实际目的来说足够好)内存占用的最佳选择。
A boolean[]
可能是处理 CPU 最快的方法,但作为原始整数类型需要 8 倍的内存。
希望你已经通过了BitSet
。我认为这是存储位的有效方式。
https://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html
但您应该将 0 视为假,将 1 视为真
我认为存储二进制矩阵最 space 最有效的方法是使用 sparse matrix,如果你有最多的 '0' 然后 '1'。 在稀疏矩阵中,您只需要使用交叉列表结构表示“1”值。
您可以在 GitHub 上找到一些实现。