2011-03-06 5 views
0

나는 세 부분으로 구성된 알고리즘을 연구 중이다. 첫 번째는 최소 길이의 페널티를 사용하여 단어를 특정 길이로 줄이는 재귀 적 방법입니다. 두 번째는 재귀 적 메서드의 동적 구현 인 알고리즘입니다. 마지막 것은 문제의 욕심 많은 알고리즘입니다. 이미 Greedy 코드가 코딩되어 있지만 Recursive 솔루션에 어려움을 겪고 있습니다. 정확히 어디에서 정확히 재귀 적 방법으로 문제가 발생하는지 모르겠지만 Knuth-Plass Algorithm과 비슷한 것이어야합니다. 재귀 알고리즘은 계승 실행 시간을 가지며 동적 솔루션을 돕는 데 더 많이 사용됩니다. 누구나 Knuth-Plass 구현에 대한 링크가 있거나 내 코드에서 거대한 것을 발견 할 수 있다면 어떤 도움을 주시면 감사하겠습니다.재귀 워드 랩 알고리즘

재귀 알고리즘 :

public static ArrayList<String> recursive(ArrayList<String> input, int size) { 
    if(input.size() <= 1) 
     return input; 
    ArrayList<String> temp1 = input; 
    ArrayList<String> temp2 = input; 
    for(int i = 0; i < input.size(); i++) { 
     if(input.size() - 1 >= size) 
      break; 
     else { 
      for(int j = 0; j < input.size(); j++) { 
       temp1.set(j, temp1.get(j) + " " + temp1.get(j + 1)); 
       temp1.remove(j + 1); 
       if(totalPenalty(blankChars(temp1, size)) < totalPenalty(blankChars(temp2, size))) { 
        input = recursive(temp1, size); 
       } else { 
        input = recursive(temp2, size); 
       } 
      } 
     } 
    } 
    return input; 
} 

totalPenalty() 및 blankChars 각 행의 끝에 페널티의 양을 리턴한다.

편집 : 아직 해결 방법이 없습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

왜 재귀 적으로 명시 적으로 원하는가? 재귀는 피할 수 있으면 비효율적 인 프로그래밍입니다. 결국 스택 공간이 부족할 수 있습니다. –

+0

나를 동적 프로그래밍 솔루션으로 안내합니다. 기본적으로 나는 재귀 적 (bad big-O이지만 동적으로 변환하는 데 도움이 됨)> Dynamic (더 빠르고 항상 올바른)> Greedy (항상 올바른 것은 아닐 수도 있음)를 시도하고 있습니다. 그 말이 맞는다면. – Zach

+0

@Chris Dennett : 재귀가 비효율적이라고 말하는 것은 좀 더 정확합니다. a) Java입니다. b) 어쨌든 제거 할 수있는 꼬리 호출이 없습니다. 그러나 그러한 조건에서도 재귀는 입력이 비교적 작을 것이라는 것을 보증 할 수 있다면 알고리즘을 더 명확하게 표현하는 데 도움이 될 수 있습니다. – hoha

답변

2

Java와 비슷하지만 Java에서는 암시 적 복사 생성자가 없습니다.

ArrayList<String> temp1 = input; < -이 하지 동일한 내용을 가진 다른 객체를 생성하지만 것 대신에 동일한 개체에 대한 참조.

ArrayList<String> temp1 = new ArrayList<String>(input); 
ArrayList<String> temp2 = new ArrayList<String>(input); 

내가 다른 실수에 대해보고하지 않은, 그래서 이것을 시도하고 당신이 더 이상 문제가있을 경우 질문을 업데이트 :

당신은에 라인 4와 5를 변경해야합니다.

크 누스 패스 나누기 알고리즘 정보; Python 구현은 http://oedipus.sourceforge.net/texlib/에서 찾을 수 있습니다. 나는 그것에 대해 자세히 보지 않았지만 설명은 당신이 찾고있는 것으로 보인다.

+0

빠른 응답을 보내 주셔서 감사합니다. 위와 같은 문제가 해결되지 않은 것 같습니다. 문제는 내 논리와 관련이 있다고 생각합니다. 실제 구현이 아니라 프레임 작업 만 있었기 때문에 링크가 도움이되지 않았습니다. 나는 정확히 Knuth-Plass Implementation을 찾고 있지는 않지만 연구를하면서 크 누스 - Plass 알고리즘이 내가 성취하려는 것에 가장 가깝다는 것을 발견했다. – Zach

+0

확실히 구현되어 있습니다. 다운로드 링크가 아래에 있습니다. –