![](/img/trans.png)
[英]Inconsistencies in Big-O of removing from an ArrayList vs a Hash Table?
[英]Big-O Memory of Array vs String
這聽起來可能很愚蠢,但我想知道自己在想一想,難道您不能使用一種算法使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)?
您描述的所有情況都是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)
我不確定您是否完全理解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)
空間復雜度算法(除了簡單的數學運算)
這里還有另一個誤解:為了真正地創建具有該O(1)屬性的“字符容器”(分別為:O(log n),因為所需的內存仍然隨着數據的增長而增長),這僅適用於:包含一種類型的n個字符和另一種類型的1個字符的字符串。
在這種情況下,是的,您只需要記住具有不同字符的索引。 這類似於定義超稀疏矩陣:如果在一個巨大的矩陣中只有一個值為!= 0,則只能存儲相應的索引,而不是存儲具有0億萬億個值的整個矩陣。
當然,有些庫可以處理稀疏矩陣,以降低在內存中保存已知0值的成本。 當您可以(輕松)計算出某個東西時,為什么還記得它呢?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.