2014-09-10 2 views
4

CS 인터뷰를 위해 공부하고 있으며 스스로 문제를 해결하고 재귀 적으로 해결하기로 결정했습니다.재귀 파스칼의 삼각형 행 큰 O 비용

내가 해결하려고하는 질문은 다음과 같습니다. 파스칼 삼각형의 n 번째 행을 찾는 재귀 함수를 작성하고 싶습니다.

Ex pascals(1) -> 1 
    pascals(2) -> 1,1 
    pascals(3) -> 1,2,1 

나는이 기능을 해결했다고 생각합니다. 그것은 기본 함수로 시작하도록 도우미 함수를 필요로합니다.

function int[] nthPascal(int[] a, int n){ 
    // in the case that the row has been reached return the completed array 
    if(n==1){ 
    return a; 
    } 
    // each new row of pascal's triangle is 1 element larger. Ex 1, 11, 121,1331 etc. 
    int[] newA = new int[a.length()+1]; 

    //set the ends. Technically this will always be 1. 
    // I thought it looked cleaner to do it this way. 
    newA[0]=a[0]; 

    newA[newA.length-1]=a[a.length-1]; 

    //so I loop through the new array and add the elements to find the value. 
    //ex 1,1 -> -,2,- The ends of the array are already filled above 
    for(int i=1; i<a.length; i++){ 

    // ex 1+1 = 2 for 1,1 -> 1,2,1 
    newA[i]=a[i-1]+a[i] 
    } 
    //call the recursive function if we are not at the desired level 
    return nthPascal(newA,n-1); 
} 

/** 
*The helper function 
*/ 
public int[] helperPascal(int n){ 
    return nthPascal(int[] {1},n); 
} 

제 질문은 어떻게 bigO 비용을 찾으십니까?

저는 일반적인 알고리즘 비용과 알고리즘을 찾는 방법을 잘 알고 있습니다. 이 재귀는 나를 혼란스럽게 만듭니다.

분명히 상수가 아니라는 것을 알고 있습니다. n, nlogn 등. 내 생각은 3^n이었습니다.

나는 예를 들어 검색과 발견 : Pascal's Triangle Row SequenceWhat is the runtime of this algorithm? (Recursive Pascal's triangle)을. 그러나 그들은 내가 믿는 특정 위치에서 특정 요소를 찾으려고 노력하고 있습니다. 나는 파스칼의 삼각형을이 방법으로 구현하고 bigO 비용에 대해 이야기하는 사람을 찾을 수 없었다.

파스칼의 기능을 찾는 재귀 행을 작성하는 더 좋은 방법이 있기 때문에입니까? 각각의 재귀 호출의 경우 :

+2

1)'nthFib'이란 무엇입니까?2) 헬퍼 함수의 올바른 구문은'return nthPascal (new int [] {1}, n);'3) 자바에서는 배열의 길이를 계산할 때'()'를 쓰지 말라. 문자열의 길이를 필요로 함). 4)'intA'는'int [...]'가 아니라'new int [...]'로 선언해야합니다. 나는 이것이 당신의 질문과 관련이 없다는 것을 깨닫습니다. – ajb

+0

1) 오, 죄송합니다. 나는 파스칼이되어야한다고 말했습니다. 파스칼은 처음 엔 피보나치를하고있었습니다. 그리고 오, 자바 도움을 주셔서 감사합니다. 내가 자바로 코딩 한 이후로 꽤 오랜 시간이 걸렸습니다. 그리고 그것을하지 않고 연습하고 있습니다. – Tai

답변

5

nthPascal을 호출 할 때마다 반복적으로 한 번만 호출됩니다. 따라서 함수를 호출 할 때마다 복잡성을 추가하여 시간 복잡도를 얻을 수 있습니다 (재귀 호출 제외). (만약 당신이 이진 트리를 가로 지르는 함수를 가지고 있다면, 그것은 일반적으로 두 번 재귀 적으로 호출 할 것이고, 이것은 계산을 더 복잡하게 만든다. 그러나 여기서는 한번만 호출하기 때문에 계산이 매우 간단하다.)

각각 함수의 호출은 a.length 시간을 실행하는 루프를 가지며 루프의 본문은 일정한 시간에 실행됩니다. Java가 배열의 모든 요소를 ​​초기화하기 때문에 배열 intA을 할당 할 때를 제외하고는 일정 시간 외에는 다른 루프 나 다른 명령문이 실행되지 않습니다. 그러나 결과는 길이가 M 인 배열로 nthPascal을 호출하면 재귀 호출을 포함하지 않는 실행 시간은 O (M)가됩니다.

그래서 상수 k에 대해 실행 시간이 대략 M * k라고 가정하면 총 실행 시간은 1 * k + 2 * k + 3 * k + ... + (n-1) * 케이. 그리고 1 + 2 + 3 + ... + n-1은 (n * (n - 1))/2이며 O (n)입니다. 그래서 O (n)가 당신이 찾고있는 해답입니다.

+0

오, 감사합니다. 나는 그것에 대해 잘못 가고 있었다. 배열에있는 값의 수는 내가 걸려 넘어 질 때마다 다르기 때문에 생각합니다. 고맙습니다! – Tai

5

을 공유하십시오, 당신은 k은 재귀 호출의 깊이 크기 k의 루프를하고있는 (깊이 k에서, 당신은 크기 k의 배열을 가지고).

깊이가 n 인 완전한 행을 얻으려면 nthPascal을 깊이 1, 2, ..., n으로 호출합니다.

따라서 전체 복잡도는 1+2+...+n=n(n+1)/2 = O(n²)입니다.