나는 세 부분으로 구성된 알고리즘을 연구 중이다. 첫 번째는 최소 길이의 페널티를 사용하여 단어를 특정 길이로 줄이는 재귀 적 방법입니다. 두 번째는 재귀 적 메서드의 동적 구현 인 알고리즘입니다. 마지막 것은 문제의 욕심 많은 알고리즘입니다. 이미 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 각 행의 끝에 페널티의 양을 리턴한다.
편집 : 아직 해결 방법이 없습니다. 어떤 도움을 주시면 감사하겠습니다.
왜 재귀 적으로 명시 적으로 원하는가? 재귀는 피할 수 있으면 비효율적 인 프로그래밍입니다. 결국 스택 공간이 부족할 수 있습니다. –
나를 동적 프로그래밍 솔루션으로 안내합니다. 기본적으로 나는 재귀 적 (bad big-O이지만 동적으로 변환하는 데 도움이 됨)> Dynamic (더 빠르고 항상 올바른)> Greedy (항상 올바른 것은 아닐 수도 있음)를 시도하고 있습니다. 그 말이 맞는다면. – Zach
@Chris Dennett : 재귀가 비효율적이라고 말하는 것은 좀 더 정확합니다. a) Java입니다. b) 어쨌든 제거 할 수있는 꼬리 호출이 없습니다. 그러나 그러한 조건에서도 재귀는 입력이 비교적 작을 것이라는 것을 보증 할 수 있다면 알고리즘을 더 명확하게 표현하는 데 도움이 될 수 있습니다. – hoha