2017-03-11 2 views
2

최근에 나는이 질문이있는 시험을 보았습니다. g의 시간 복잡도는 얼마입니까?이 코드 조각의 Big-O는 무엇입니까?

int f(int *arr, int n, int m) 
{ 
    if(n == 0) 
    { 
     if(m == 0) 
      return 3; 

     return arr[m] + f(arr, n, m - 1); 
    } 

    return f(arr, n - 1, m); 
} 

int g(int *arr, int n) 
{ 
    return f(arr, n, n); 
} 

이제 명확 F와 아무것도 2 * n을 호출이 있기 때문에 저와 제 친구들의 대부분은 O (n)을 대답하지만, 교수의 대답은 (n은^2) O했다. 누가 나에게 맞는지 설명 할 수 있습니까? 그 사람이라면 이유를 설명해 주시겠습니까?

+0

작성된대로 O (n)이고 분석 결과가 정확합니다. 문제를 잘못 교정하지 않았습니까? 내부 호출은'f (arr, m, m-1)'입니까? 필자는 내부 호출'f (arr, n, m-1)'에서'n '을 참조하는 것은별로 의미가 없다. 왜냐하면'n'이 항상 0이기 때문이다. –

+0

나는 그것을 매우 조심스럽게 검사했고 n이고 m이 아닙니다. 나는 그 교수가 실제로 그것을 m라고 오인하고 O (n^2)라고 말한 것으로 생각합니다. – nononoha

+0

'O (n * m)'그러나 함수 호출은'n == m'이므로'O (n^2)'입니다. –

답변

2

편집 : 게시물에

, 내가 틀린 문제를 해결하는 것을 알고 있습니다. 내부 함수 호출이 f(arr, m, m - 1) 일 때이를 해결하려고했습니다. 이 경우 시간 복잡도는 실제로 O (n²)입니다. 질문이 게시 된 방식으로 시간 복잡성은 O (n)입니다. 그러나이 교수는 교수가 잘못 이해 한 방법 일 가능성이 큽니다. 따라서 다음 질문에 대한 답은 참고 용으로 작성된 것입니다. n == 0 n은 스택을 호출하는 것을 의미 f() n 번 반복적으로

  1. 전화 :

    는 촬영 단계를 고려하십시오.

  2. 이제 가장 낮은 함수 호출에서 if 문을 입력 할 수 있습니다.
  3. f()을 다시 호출하여 m을 줄이지 만 m을 두 번째 인수로 호출하여 원래의 n 값을 유지합니다.
  4. 이 '새'재귀 스택에서 m을 1 씩 줄이기 전에 먼저 f()을 n (또는 m) 번 다시 호출해야합니다.
  5. m == 0 번으로 돌아 오면 되돌릴 수 있습니다.

모든 '단위'는 f()에 대한 하나의 호출을 나타내는이 그래프를보십시오. n == 0 일 때, 우리는 세 번째 인자를 다시 호출하고 m을 1 씩 줄이므로 레벨을 떨어 뜨립니다. A graph of n and m values

이 그래프에서 사각형의 영역 n * mm == n 때문에 , 즉 f() 배라는 것을 의미하고, 코드는 O (n²) 시간 복잡도를 갖는다.

+0

"우리는 f()를 다시 호출하여 m을 줄이지 만 원래의 n 값을 유지합니다."- 그게 어때? 전화를 걸 때 n은 항상 0입니다. –

+0

죄송합니다. 지금 질문을 수정하십시오. 내가 잘못된 문제를 해결하고있는 것 같아. 아마 그것이 의도 된 방법이었을 것입니다. 따라서 편집은 그것에 집중할 것입니다. –

관련 문제