很抱歉,如果这是一个愚蠢的问题,但是......
此代码的复杂性顺序为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)?
我怎么知道确定任何标准函数的复杂度顺序是什么?
答案 0 :(得分:6)
是的,it has to be at least O(n) by design - 它接收第一个字符的地址,并且必须通过沿字符串扫描找到空字符,它只能通过推进和检查每个字符来实现。
答案 1 :(得分:1)
某些功能在标准中定义了复杂性。其他人,包括从C继承的人,没有。对于那些人来说,除了实施质量之外,你不能依赖任何其他东西来保持最低限度。
答案 2 :(得分:1)
是的,strlen是O(n),但在这个特定的例子中(带有字符串文字),一个好的优化器可以用strlen(buf)
替换sizeof(buf)
。有些编译器可以。