2013-03-05 9 views
0

주어진 문자열의 순열을 인쇄하는 데 다음 코드가 있습니다. 이 코드의 실행 시간을 알아 내려고 노력하고 있어요문자열 순열을 인쇄하는 알고리즘 - 실행 시간 분석

public static int count = 0; 

public static void permute(String soFar, String strLeft) { 

    if(strLeft.length() == 1) { 
     soFar += strLeft; 
     System.out.println(++count + " :: " + soFar); 
    } 

    for(int i=0; i<strLeft.length(); i++) { 
     permute(soFar + strLeft.charAt(i), strLeft.substring(0,i) + strLeft.substring(i+1)); 
    } 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    String input = "abcd"; 
    permute("",input); 
} 

[편의상 아니라 내가 노력하고 무엇에 초점을 풀어 문자열의 문자가 중복되지한다고 가정 할 수 있습니다].

지금까지의 생각을 내 체인 : 재발을 쓰려고 ,

T(n) = n * T(n-1) + O(n) for n > 1 
    = 1     for n = 1 

는 N있다! 순열 (recutive calls)의 수는 n보다 큽니다. 사실 입력 문자열이 "abcd"인 경우 (예 : 4 자), permute 함수 호출 수는 65입니다.

이 코드의 실행 시간을 찾는 방법에 대한 지침은 무엇입니까?

+0

더 큰 것은 무엇입니까? 메서드 호출 횟수 또는 런타임 중에 출력되는 숫자의 양은 어느 정도입니까? – Makoto

+1

중복/비슷한 질문이 있으십니까? http://stackoverflow.com/questions/11425344/what-is-the-complexity-big-o-of-this-algorithm – apnorton

+0

@anorton - 네, 복제본처럼 보입니다. 감사! 나는 다른 스레드에서 대답을 통해 갈 것이며 이것을 닫은 것으로 표시 할 것이다. –

답변

1

글쎄, 우선, 당신은 여분의 전화를합니다. 한 문자 만 남아 있으면 솔루션을 내 보냅니다. 그러나 여전히 permute을 빈 문자열로 호출하고 호출 횟수를 망칠 것입니다.

첫 번째 개선점은 elseif 절에 추가하는 것입니다.

public static void permute(String soFar, String strLeft) { 

    if(strLeft.length() == 1) { 
     soFar += strLeft; 
     System.out.println(++count + " :: " + soFar); 
    } 
    else { 
     for(int i=0; i<strLeft.length(); i++) { 
      permute(soFar + strLeft.charAt(i), strLeft.substring(0,i) + strLeft.substring(i+1)); 
     } 
    } 
} 

이것은 통화 수를 41로 줄입니다. 통화 수를 계산하려면 호출 트리를 구성하고 노드 수를 계산하십시오. 각 통화는 문자열에서 하나 개의 문자를 제거함으로써 수행되는 것처럼있다 : 길이 4
1 비디오, 길이 3
4 비디오, 길이 2
12 통화 및 길이 1
24 통화

41까지 합계. Voilá.

+0

감사합니다. 그래서 크기 n의 문제에 대한 일반적인 해결책은 다음과 같습니다 : n!/1! + n!/2! + ... + n!/n! –

+0

위의 일반 솔루션을 해당 Big-Oh로 변환하는 방법을 아직도 모르지만 문제 또는 재귀 호출이 어떻게 확산되는지 나타내는 관계를 이해하는 것이 더 중요했습니다. 그러니 당신의 대답에 +1하고 받아 들인 것으로 표시했습니다. 감사! –

+0

당신은 오신 것을 환영합니다. – alzaimar

관련 문제