2011-03-11 2 views
2

죄송 표준 lib 디렉토리 기능의 복잡성의 주문,하지만 ...이 바보 같은 질문 인 경우

이 코드의 복잡성의 순서는 (n)이 O입니다 :

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

+1

@Bagpuss : 예, 달리 지정하지 않는 한 모든 코드는 블랙 박스입니다. – sharptooth

+0

그것은 당신이보고있는 복잡한 경계에 달려 있습니다. strlen의 경우, 최하위의 경우는 선형이지만, 구현을 알지 못하면 상한을 알 수 없습니다. 그러나 선형 알고리즘이 일종의 분명한 사실을 감안할 때 상식적으로 선형 알고리즘은 그러한 방식으로 구현됩니다. – ltjax

1

예, strlen은 O (n)이지만,이 특별한 예에서는 (문자열 리터럴을 사용하여) 좋은 옵티마이 저는 strlen(buf)sizeof(buf)으로 바꿀 수 있습니다. 일부 컴파일러는 않습니다.

관련 문제