这听起来可能很愚蠢,但我想知道,想一想,您是否无法使用一种算法并使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)?
答案 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 -> INF
和const <> 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值保留在内存中的成本。当您可以(轻松)计算出某个东西时,为什么还记得它呢?