Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么一个位向量与一个布尔数组相比只能减少8倍的空间使用?_Java_Space_Space Complexity_Bitvector - Fatal编程技术网

Java 为什么一个位向量与一个布尔数组相比只能减少8倍的空间使用?

Java 为什么一个位向量与一个布尔数组相比只能减少8倍的空间使用?,java,space,space-complexity,bitvector,Java,Space,Space Complexity,Bitvector,我正在阅读破解编码访谈,有一个问题,“实现一个算法来确定一个字符串是否具有所有唯一字符。如果不能使用其他数据结构怎么办?” 假设使用ASCII字符串,一个明显的解决方案是在256布尔数组中存储以前是否使用过字符。更节省空间的解决方案是使用位向量。我的理解是这样实现的:一个整数数组,其中整数的每一位要么是真值,要么是假值。假设我们有32位整数。然后我们需要一个由8个这样的整数组成的数组来获得32*8=256个布尔值,这些布尔值存储在位中。这些数据将仅存储在256位中。另一方面,如果布尔值以n位存储

我正在阅读破解编码访谈,有一个问题,“实现一个算法来确定一个字符串是否具有所有唯一字符。如果不能使用其他数据结构怎么办?”

假设使用ASCII字符串,一个明显的解决方案是在256布尔数组中存储以前是否使用过字符。更节省空间的解决方案是使用位向量。我的理解是这样实现的:一个整数数组,其中整数的每一位要么是真值,要么是假值。假设我们有32位整数。然后我们需要一个由8个这样的整数组成的数组来获得32*8=256个布尔值,这些布尔值存储在位中。这些数据将仅存储在256位中。另一方面,如果布尔值以n位存储,则需要n*256位来存储数组

这就是我困惑的地方。书中说,使用位向量可以将空间减少8倍。这只有在n=8的情况下才是正确的,但我不认为布尔值在Java(本书使用的语言)中存储在2字节中,因此这是不正确的。那么,我做错了什么/为什么使用位向量会将空间减少8倍


编辑:我知道一个字节中有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,因此我感到困惑。