Java 为什么一个位向量与一个布尔数组相比只能减少8倍的空间使用?
我正在阅读破解编码访谈,有一个问题,“实现一个算法来确定一个字符串是否具有所有唯一字符。如果不能使用其他数据结构怎么办?” 假设使用ASCII字符串,一个明显的解决方案是在256布尔数组中存储以前是否使用过字符。更节省空间的解决方案是使用位向量。我的理解是这样实现的:一个整数数组,其中整数的每一位要么是真值,要么是假值。假设我们有32位整数。然后我们需要一个由8个这样的整数组成的数组来获得32*8=256个布尔值,这些布尔值存储在位中。这些数据将仅存储在256位中。另一方面,如果布尔值以n位存储,则需要n*256位来存储数组 这就是我困惑的地方。书中说,使用位向量可以将空间减少8倍。这只有在n=8的情况下才是正确的,但我不认为布尔值在Java(本书使用的语言)中存储在2字节中,因此这是不正确的。那么,我做错了什么/为什么使用位向量会将空间减少8倍Java 为什么一个位向量与一个布尔数组相比只能减少8倍的空间使用?,java,space,space-complexity,bitvector,Java,Space,Space Complexity,Bitvector,我正在阅读破解编码访谈,有一个问题,“实现一个算法来确定一个字符串是否具有所有唯一字符。如果不能使用其他数据结构怎么办?” 假设使用ASCII字符串,一个明显的解决方案是在256布尔数组中存储以前是否使用过字符。更节省空间的解决方案是使用位向量。我的理解是这样实现的:一个整数数组,其中整数的每一位要么是真值,要么是假值。假设我们有32位整数。然后我们需要一个由8个这样的整数组成的数组来获得32*8=256个布尔值,这些布尔值存储在位中。这些数据将仅存储在256位中。另一方面,如果布尔值以n位存储
编辑:我知道一个字节中有8位,以上只是一个愚蠢的错误。问题的答案是注释,以及对我的困惑的解释。一个字节长8位,布尔值存储在一个字节中,因此系数为8。@ElliottFrisch对于ASCII字符串,至少ASCII标准中只有128个字符,所以您可以使用两个64位
长
s,如果数组是不允许的,正如@MauricePerry指出的,这个问题是有缺陷的;你说“如果一个布尔值存储在n位中”,那么“只有当n=8时才是真的”,因为布尔值存储在一个字节中,占用8位内存。我不知道你是怎么从n=8位变为2字节的。是的,那是一个愚蠢的错误,我认识到一个字节中有8位肯定是思维上的失误。然而,我之前研究了java布尔值中有多少字节的问题,并对此感到困惑,因为如果你用谷歌搜索“java布尔值有多少字节”,谷歌建议的结果是“9字节”,但进一步研究表明,实际上只有1字节的有效负载和8字节的头。我想这个空间的使用是在一个布尔数组中优化的?这对我来说是非常不清楚的,因此这个问题啊,非常感谢@kaya3!!!在你写那篇文章之前,我还是有点不确定。我几乎从未使用过Java,因此我感到困惑。