簡體   English   中英

陣列初始化的時間復雜度是多少?

[英]What is the time complexity of array initialization?

考慮以下兩種C或C ++中的數組初始化情況:

情況1:

int array[10000] = {0}; // All values = 0

案例2:

int array[10000];
for (int i = 0; i < 10000; i++) {
    array[i] = 0;
}

他們倆都花時間嗎? 案例1的復雜性是什么? 哪個更好?

從理論上講,兩者都具有相同的時間復雜度: O(N) ,其中N是數組的大小。

但是,第一種方法應該更好,因為編譯器可以選擇盡可能快地初始化(例如,可以通過memset完成)。 對於優化,編譯器通常比程序員更好。

順便說一句,如果你的數組有靜態存儲持續時間(例如,如果你將它聲明為全局變量),它將自動初始化為0。

在數組具有靜態持續時間(全局變量)的情況下,我會說第一個是非常優選的,因為它不需要任何代碼 - 它由運行時環境初始化。

如果變量是自動持續時間(局部變量),哪一個更好,哪一個比另一個好,取決於編譯器。 最有可能的是,兩者都非常相似。

對於所有情況,自動存儲持續時間變量的復雜度為O(n)。 第一種情況是O(1)表示靜態存儲持續時間變量。

當然,如果你想用值5填充數組,第二個選項要好得多,因為它不需要在源文件中寫入10000 5

您可能還會發現使用memset(array, 0, sizeof(array)); 優於兩者 - 再次,取決於編譯器。 這仍然是O(n),但填充數組所需的實際時間可能更短,因為memset可能比編譯器為循環情況[以及它對初始化變量的作用]生成的內容更好地進行優化。 memset也無法用5填充數組。

你也可以使用std::fill(array, &array[10000], 5); 在所有數組中設置值5,編譯器應該是一個很好的優化。

最后,我應該指出,如果這些事情在代碼中執行很多,那么這些事情才真正重要。 這是一段很長的時間,因為填充40KB的數據需要花費足夠長的時間來真正擔心它自己。 喜歡20多年。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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