数组与字符串的大O内存

时间:2018-09-20 03:19:46

标签: java algorithm big-o

这听起来可能很愚蠢,但我想知道,想一想,您是否无法使用一种算法并使O(n)的内存看起来像O(1)?

(Java) 假设您有N个true或false元素数组。 然后,该数组将产生O(n)内存。

但是,如果我们有一个说“ FFFFFTFTFFT”的数组,并且每个charAt(i)回答该数组第i个索引的结果,那么我们是否仅使用了O(1)内存,还是认为O(n)的内存是因为String是O(n)本身的大小?

让我们更进一步。 如果我们有一个由true和false组成的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)?

3 个答案:

答案 0 :(得分:2)

您所描述的所有情况都是<a-box ... grabbable></a-box> .. <a-entity raycaster="objects: .clickable" cursor="rayOrigin:mouse" super-hands="colliderEvent: raycaster-intersection; colliderEventProperty: els; colliderEndEvent: raycaster-intersection-cleared; colliderEndEventProperty: el"></a-entity>,它描述了conn.Open(); SqlCommand cmd = new SqlCommand("Select ZoneID from Zones", conn); SqlDataReader myReader = cmd.ExecuteReader(); List<int> zoneIDs = new List<int>(); while (myReader.Read()) { zoneIDs.Add(Convert.ToInt32(myReader["ZoneID"])); } cmd.Dispose(); myReader.Close(); foreach (int zones in zoneIDs) { int Zone_ID = zones; } 趋于无穷大时的限制行为,用数学方法表示:

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

所以f(n)/n -> const, as n -> INFconst <> 0

正如您所写,下一条语句也正确:10*n + 100 = O(n)

答案 1 :(得分:0)

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

符号O(N)是N个元素的函数的上限,由O(N/8) = O(N)所指出,它并不是由基础数据类型的大小来定义的。

例如

  

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

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

  

charAt(i)

由于要访问一个元素,因此仅此操作就耗时O(1)。但是您在数组或字符串中有N个元素,因此O(N)个空间复杂度

我不太确定是否有通用的O(1)空间复杂度算法(除了简单的数学运算)

答案 2 :(得分:0)

这里还有另一个误解:为了真正制作具有该O(1)属性的“字符容器”(分别为:O(log n),因为所需的内存 still 随着增长而增长数据),它仅适用于以下情况:包含一种类型的 n 字符和另一种类型的 1 字符的字符串。

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

当然:有些库可以处理稀疏矩阵,以减少将已知0值保留在内存中的成本。当您可以(轻松)计算出某个东西时,为什么还记得它呢?

相关问题