2014-10-28 36 views
-3

如何提高此代碼的時間複雜度?如何提高此代碼的時間複雜度?

$s = "Name"; 
    for($i=0; $i<strlen($s); $i++) { 

    //some code 

    } 
+0

這是不如此複雜,你爲什麼這麼想? – Mihai 2014-10-28 18:46:37

+0

你知道這個for循環是所有迭代循環中最快的嗎? – 2014-10-28 18:47:46

+0

對不起,在想JavaScript。儘管如此,基本的循環仍然非常快。您在此時正在執行微優化 – 2014-10-28 18:49:09

回答

0

這取決於PHP的Strings和strlen()的實現。如果它是O(n)(它在GNU的C strlen()中),OP代碼的複雜度將是O(n 2)。移動strlen()跳出循環會在這種情況下提高至O(N):

$length = strlen($s); 
for($i=0; $i<$length; $i++) { 

//some code 

} 

然而,如果的strlen()複雜度爲O(1)(e.g. C++),該代碼是在爲O(n ),你無法再改進它。

我不得不承認,我是不流利的C/C++,但我想長度爲a zend_string的簡單屬性,即PHP's strlen()是O(1):

ZEND_FUNCTION(strlen) 
{ 
    zend_string *s; 
    // [..] 
    RETVAL_LONG(s->len); 
} 
+0

你是對的,strlen()在覈心PHP中是O(1)。將調用strlen()移出循環不會改變時間複雜度,只會減少n個函數調用到單個函數調用的開銷,這是一個實現細節 – 2014-10-28 20:47:28