2011-03-11 32 views
2

很抱歉,如果這是一個愚蠢的問題的複雜性,但是......秩序的標準庫函數

這種複雜代碼的順序是O(n):

char buf[] = "hello world"; 
size_t length = strlen(buf); 

for(size_t i = 0; i < length; i++) 
{ 
    //do stuff 
} 

這個代碼O(n^2):

char buf[] = "hello world"; 
for(size_t i = 0; i < strlen(buf); i++) 
{ 
    //do stuff 
} 

因爲strlen是O(n)。

但是誰說strlen是O(n),它是否在標準中定義,它是否必須是O(n)?

我怎樣才能知道當然什麼是任何標準函數的複雜性將是什麼?

回答

1

某些函數在標準中定義了其複雜性。其他人,包括那些從C繼承而來的人,沒有。對於那些人來說,除了執行質量以外,你不能依賴其他任何東西來保持最低限度。

+0

這並不意味着任何使用複雜函數未知的函數的代碼的複雜性的順序本身是不可知的? – Bagpuss 2011-03-11 10:54:33

+1

@Bagpuss:是的,除非另有規定,否則任何代碼都是黑匣子。 – sharptooth 2011-03-11 10:57:41

+0

這取決於你正在查看哪種複雜度 - 對於strlen,下限最壞情況是線性的 - 但你不知道實現的上限。然而,考慮到線性算法很明顯,常識意味着它是以這種方式實現的。 – ltjax 2011-03-11 10:59:56

1

是的,strlen是O(n),但在這個特定的示例中(使用字符串文字),優化器可以用代替sizeof(buf)。有些編譯器可以。