2015-01-30 1 views
0
void doSomething(int *a, int left, int right){ 
    if (left == right){ 
     for (int j = 0; i < right; ++j) 
     cout << a[j]; 
     cout << endl; 
     return; 
    } 
    for (int i = left; i < right; ++i){ 
     std::swap(a[left], a[i]); 
     doSomething(a, left + 1, right); 
     std::swap(a[left], a[i]); 
    } 
} 

"기본 사건이 T (1) = right라고 가정하고, 스왑 함수가 O에서 두 개의 인수 값을 교환한다고 가정합니다. 1) 시간이고 반복 관계의 경우 T (n), n = right-left + 1이라고합시다. "알고리즘의 반복 관계

위에서 주어진 코드의 반복 관계를 찾도록 요청 받았습니다. 첫 번째 'if'문은 단지 == right가 될 때마다 배열의 내용을 단순히 출력한다는 결론을 내릴 수있었습니다. 맨 아래 부분은 반복적 인 문장이지만 복잡성을 분석하는 방법을 알지 못합니다. 어떤 도움을 주시면 감사하겠습니다!

+0

먼저 문제에 대한 직감을 개발해야합니다. 방법? 디버거에서'1,2,3,4, ..., n '으로 지정된 데이터를 가리키는'int *'를 전달하고'left'와' 맞아. 디버거를 사용하여 어떤 일이 발생하는지 확인하십시오. 그리고 이것은 관련성이 없지만 교수님의 문제가 마음에 듭니다. – druckermanly

+0

반복 관계를 찾는 것은 복잡성 분석과 다릅니다 ... http://en.wikipedia.org/wiki/Recurrence_relation을 참조하십시오. – amdn

+0

나는 'n = 1,2,3 , 4'는 문제에 대한 직감을 얻으려고 노력한다. 하지만 누군가가 어쨌든 숙제를 해결해 준 것 같습니다. :) – druckermanly

답변

1

swap은 부적합합니다. 인쇄 된 내용에 영향을 미치지 만 알고리즘의 실행 시간에는 영향을 미치지 않습니다. 무엇이 발생하는지 살펴 보겠습니다.

doSomething(arr, j, j)j을 표시합니다.
doSomething(arr, i, j)으로 전화하면 j-i 번으로 전화가 doSomething(arr, i+1, j)이됩니다.

변수를 조금 재정의하고 f(i)doSomething(arr, j-i, j)으로 정의하십시오. 그런 식으로 f(0)은 기본 케이스입니다. 재발 규칙은 다음과 같이 다시 쓸 수 있습니다.

f(i-1)으로 전화를 겁니다.

T(n) = O(n! * n) 

말할 필요도없이, 그건 꽤 큰 런타임의 : 말을하는 것입니다

T(n) = n * T(n-1) 
T(1) = O(n) 

: 꽤 명확한 재발 관계를 만드는

!

+0

그것은 매우 도움이되었다, 감사합니다 Barry! – Jason

관련 문제