簡體   English   中英

數組的大O內存與字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM