2011-03-11 50 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)。有些编译器可以。