3 回答
TA贡献1847条经验 获得超11个赞
您描述的所有情况都是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)
TA贡献1815条经验 获得超6个赞
这里还有另一个误解:为了真正制作一个具有 O(1) 属性的“字符容器”(分别为:O(log n),因为所需的内存仍然随着数据的增长而增长),这只适用于: 包含n个一种字符和1个另一种字符的字符串。
在这种情况下,是的,您只需要记住具有不同字符的索引。这类似于定义一个超级稀疏矩阵:如果在一个巨大的矩阵中只有一个值是 != 0,则您可以只存储相应的索引而不是整个矩阵,其中包含无数个 0 值。
当然:有些库可以为稀疏矩阵执行此类操作,以降低将已知 0 值保留在内存中的成本。当您可以(轻松)计算某些东西时,为什么还要记住它?!
TA贡献1803条经验 获得超6个赞
我不确定您是否完全理解 Big O 的概念,但是在列出的每个案例中您仍然有 N 个元素。
该符号O(N)
是 N 个元素的函数的上限,而不是由底层数据类型的大小定义,因为如上所述O(N/8) = O(N)
。
所以,例如,
如果我们有一个包含真假的 N 数组并将其转换为字节
您正在将 N 个元素转换为 N 个字节。这是O(N)
时间复杂度。您存储了2 * O(N)
全部数组,从而导致O(N)
空间复杂性。
charAt(i)
仅此操作就是O(1)
时间复杂度,因为您正在访问一个元素。但是你有N
数组或字符串中的元素,所以它是O(N)
空间复杂度
我不太确定是否有一个通用的O(1)
空间复杂度算法(除了简单的数学运算)
添加回答
举报