Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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 数组与字符串的大O内存_Java_Algorithm_Big O - Fatal编程技术网

Java 数组与字符串的大O内存

Java 数组与字符串的大O内存,java,algorithm,big-o,Java,Algorithm,Big O,这听起来可能很愚蠢,但我在想,你能不能用一个算法让O(n)内存看起来像O(1) (爪哇) 假设您有一个由N个元素组成的数组,这些元素的值为真或假。 然后该数组将产生O(n)内存 然而,如果我们有一个数组,比如说“fffff tftft fft”,每个字符(i)回答数组第i个索引的结果,那么我们不是只使用了O(1)内存吗?或者它被认为是O(n)内存,因为字符串本身就是O(n)的大小 让我们更进一步。 如果我们有一个N数组的真和假,并将其转换为字节,我们使用的内存甚至更少。那么字节也被认为是O(1)

这听起来可能很愚蠢,但我在想,你能不能用一个算法让O(n)内存看起来像O(1)

(爪哇) 假设您有一个由N个元素组成的数组,这些元素的值为真或假。 然后该数组将产生O(n)内存

然而,如果我们有一个数组,比如说“fffff tftft fft”,每个字符(i)回答数组第i个索引的结果,那么我们不是只使用了O(1)内存吗?或者它被认为是O(n)内存,因为字符串本身就是O(n)的大小

让我们更进一步。 如果我们有一个N数组的真和假,并将其转换为字节,我们使用的内存甚至更少。那么字节也被认为是O(1)内存还是O(n)内存? 例如,假设n=6。那么数组大小是6=O(n)。但字节大小仅为1字节,因为1字节可以存储8个不同的值(8位)。这是O(1)还是O(n),因为对于大n,我们得到以下情况…:
N等于10000。数组是O(n)内存,但字节是什么内存?因为我们的字节是O(n/8)=O(n)?

我不确定您是否完全理解大O的概念,但在列出的每种情况下,您仍然有n个元素

表示法
O(N)
是N个元素的函数的上限,与其说是由底层数据类型的大小定义的,不如说是因为如上所述
O(N/8)=O(N)

那么举个例子,

如果我们有一个N-数组的真和假,并将其转换为字节

您正在将N个元素转换为N个字节。这是时间复杂性。您存储了
2*O(N)
total数组,导致
O(N)
空间复杂度

charAt(i)

仅此操作就具有时间复杂性,因为您要访问一个元素。但是数组或字符串中有
N
元素,所以它是
O(N)
空间复杂度


我不确定是否有一个通用的
O(1)
空间复杂度算法(在简单的数学运算之外)

我不确定您是否完全理解大O的概念,但在列出的每种情况下仍然有N个元素

表示法
O(N)
是N个元素的函数的上限,与其说是由底层数据类型的大小定义的,不如说是因为如上所述
O(N/8)=O(N)

那么举个例子,

如果我们有一个N-数组的真和假,并将其转换为字节

您正在将N个元素转换为N个字节。这是时间复杂性。您存储了
2*O(N)
total数组,导致
O(N)
空间复杂度

charAt(i)

仅此操作就具有时间复杂性,因为您要访问一个元素。但是数组或字符串中有
N
元素,所以它是
O(N)
空间复杂度


我不确定是否存在一种常见的
O(1)
空间复杂度算法(在简单的数学运算之外)

您描述的所有情况都是
O(n)
,它描述了
n
趋于无穷大时的限制行为,数学上说:

f(n)=O(n),as n->INF
等于
f(n)/n->const,as n->INF
,其中
const 0

所以
10*n+100=O(n)
0.1*n=O(n)


正如你所写的,下一句话也是正确的:
O(n/8)=O(n)=O(n/const)
你所描述的所有情况都是
O(n)
,它描述了
n
趋于无穷大时的极限行为,从数学上说:

f(n)=O(n),as n->INF
等于
f(n)/n->const,as n->INF
,其中
const 0

所以
10*n+100=O(n)
0.1*n=O(n)


正如您所写的,下一条语句也是正确的:
O(n/8)=O(n)=O(n/const)

这里还有另一个误解:为了真正用O(1)属性(分别是:O(logn),因为所需的内存仍然随着数据的增长而增长),这只适用于以下情况:一种字符串包含n个字符,另一种字符串包含1个字符

在这种情况下,是的,您只需要记住具有不同字符的索引。这类似于定义超级稀疏矩阵:如果只有一个值是!=在一个巨大的矩阵中,您只能存储相应的索引,而不是包含无数个0值的整个矩阵


当然,还有一些库可以为稀疏矩阵做这样的事情,以减少在内存中保留已知0值的成本。当你可以(轻松地)计算时,为什么要记住它

这里还有另一个误解:为了真正使用O(1)属性(分别为:O(logn),因为所需的内存仍然随着数据的增长而增长),这只适用于:包含n个字符的字符串和1个字符的字符串

在这种情况下,是的,您只需要记住具有不同字符的索引。这类似于定义超级稀疏矩阵:如果只有一个值是!=在一个巨大的矩阵中,您只能存储相应的索引,而不是包含无数个0值的整个矩阵


当然,还有一些库可以为稀疏矩阵做这样的事情,以减少在内存中保留已知0值的成本。当你可以(轻松地)计算时,为什么要记住它

字符串和字符[]没有什么不同。如果你有一个true和false数组,你有一个位向量,而不是一个
字节[]
,但你仍然有N个元素,你必须包括(基础)数组的大小。一个字节不能“存储8个不同的值”。它可以存储从两个可能值(从集合{0,1})中选择的8个值。或者,它可以存储从一组2^8=256个可能值中选择的1个值。或之间的任何变化(例如