텍스트를 특정 줄 수로 균일하게 나누십시오.


12

텍스트를 최대 너비의 선으로 균등하게 나누는 선형 시간 알고리즘이 있습니다. SMAWK (또는 Knuth & Plass)를 사용하며 "균등"은 다음을 의미합니다. http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

위의 알고리즘에는 최대 줄 너비 대신 텍스트를 나누려는 줄 수를 고려하는 알고리즘 또는 오목한 비용 함수가 있습니까? 선형 시간에도?

즉, 입력이 원하는 줄 너비가 아닌 원하는 줄 수인 줄 바꿈 (또는 단락 형성 또는 단어 줄 바꿈) 알고리즘을 찾고 있습니다.

실제로 사용할 수없는 접근 방식을 설명하기 만하면됩니다. 각 단어 쌍 사이에 N 개의 단어와 N-1 개의 공백이 있으며 M은 원하는 행 수입니다 (M <= N). 각 공백 후에 최대 하나의 줄 바꿈이있을 수 있습니다. 이제 알고리즘은 가능한 각 조합에 나누기를 배치하여 "정지"를 계산하고 가장 좋은 것을 반환하려고 시도합니다. 훨씬 빠르게하는 방법?

또한 그러한 문제에 이름이 있습니까? 문제의 "가족"은 무엇입니까? (예 : "빈 포장") 완벽하게 최적의 솔루션이 필요하지 않으면 아주 좋은 솔루션이 훨씬 더 빨리 해결 될 수 있습니까? (지정된 입력에 대해 항상 동일하거나 아마도 최적이 아닌 솔루션이있는 경우 일부 형태의 휴리스틱을 사용할 수 있습니다).

최신 정보

찬드라 체 쿠리는 "동적 프로그래밍에 관한 Kleinberg and Tardos 장의 문제"를 다음과 같이 제안했다. 잘 읽었지만 줄 수보다 너비를 기준으로 줄 바꿈을 처리합니다. 내가 지금 알아 내려고하는이 문제에 적응할 수 있습니다. 다음은 솔루션에 대한 좋은 링크입니다. 선형 시간으로 해결한다고 주장합니다. http://web.media.mit.edu/~dlanman/courses/cs157/HW5.pdf

또한 Skiena의 Algorithm Design Manual에 "8.5 파티션 문제"장이 있습니다.이 주제는 정확히 주제에 해당되는 것 같습니다. (불행히도, 내가 이해 한 것으로부터 2 차 시간 복잡성이 있음)


5
멋진 동적 프로그래밍 문제! 다음 학기 수업에서 숙제로 사용할 수도 있습니다.
Jeffε

3
@ Jɛ ff E 숙제 문제로 사용하려면 답변을 웹에 게시하기 전에 질문을 닫는 것이 좋습니다.
Joe

1
@ 조 : 답변에 실제로 관심이있는 사람은 질문을 닫는 것이 아니라 대답하는 것을 선호합니다.
Ecir Hana

2
@Joe : 숙제가 아니고 CS도 공부하지 않습니다. "숙제 수준"이 진행되는 과정에서 어떤 사람들은 문제를 해결하는 방법을 이미지화 할 수없고 다른 사람들은 "숙제 수준"이라고 생각합니다. 예를 들어 답은 일주일 안에 지워지거나 내 이메일로 전송 될 수 있습니다. 그리고 "완전한 답변"이 아니라는 것에 감사드립니다.
Ecir Hana

3
Kleinberg and Tardos 장에는 동적 프로그래밍에 관한 문제가 있는데, 이는 줄의 슬랙의 합을 최소화하는 방식으로 형식을 지정해야합니다.
찬드라 체 쿠리

답변:


4

다른 선에 대해 아무 것도 몰라도 선의 울퉁불퉁 함을 계산할 수 있으면 그래프에서 최소 가중치 링크 경로 를 찾는 것으로 문제를 모델링 할 수 있습니다 . 가장자리에 오목한 정수 가중치를 사용하면 시간 의 문제를 해결 하는 알고리즘 이 있습니다. 여기서 는 최대 절대 가장자리 가중치입니다. 다른 알고리즘 은 이라고 가정하고 오목한 모서리 가중치에 대해 시간 의 문제를 해결합니다 . 두 알고리즘 모두 일정한 시간에 가장자리의 무게를 계산할 수 있다고 가정합니다.MO(NlogU)UN2O(logMloglogN)M=Ω(logN)

이진 검색을 사용하여 SMAWK가 행을 사용하는 행 너비를 찾을 수도 있습니다 . 그러나이 알고리즘은 정확히 줄 의 솔루션을 보장하지 않습니다 .MM


매우 죄송하지만 팔로우하지는 않습니다. "가장자리 가중치"는 단어의 길이입니까? "그래프"는 어떻게 생겼습니까? 노드가 중단 점이고 모서리가 단어의 길이 인 선형 그래프입니까? 그리고이 "M- ​​링크 경로"는 결과 세그먼트가 최소의 합을 갖도록 분해합니다. 그러나 가장 중요한 것은 첫 번째 문장에서 비정형을 독립적으로 계산할 수 있는지 확실하지 않습니다. 그것은 가장 긴 줄과 실제 줄의 차이이므로 대략 다른 줄에 대해 알아야합니다. 마지막 줄에 대해서는 위의 15 번째 주석을 참조하십시오.
Ecir Hana

@Ecir : 우리는 노드 에서 노드 까지 정확히 모서리를 갖는 최소 가중치 경로를 찾고 있습니다. 경로에 모서리 가 있다는 것은 에서 까지의 단어 가 단일 선을 형성 한다는 것을 의미 하며 모서리의 가중치는 해당 선이 솔루션의 울퉁불퉁함에 기여하는 것입니다. M1N+1(i,j)ij1
Jouni Sirén

@Ecir : 동적 프로그래밍에 기반한 모든 알고리즘은 본질적으로 라인의 비정형을 독립적으로 계산할 수 있어야합니다. 그렇지 않은 경우 두 번째 아이디어와 같은 것을 사용하고 싶을 수 있습니다. 선 너비를 추측하고 해당 너비를 기반으로 솔루션을 계산 한 다음 더 나은 솔루션을 찾기 위해 반복합니다.
Jouni Sirén

설명 주셔서 감사합니다. 두 가지 질문이 더 있습니다. "이진 검색"옵션을 사용할 때 줄 수 M을 보장하기 위해 할 수있는 일이 있습니까? 각 줄 너비에 작은 임의의 엡실론을 추가하여 같은 너비의 줄이 없으면 나누기 배치보다 더 높은 해상도를 얻을 수 있습니다.
Ecir Hana

그리고 "M- 링크 경로"의 경우, 두 논문은 "최소 K- 링크 경로가 O (nK) 시간 내에 계산 될 수 있음을 쉽게 보여줄 수있다"고 언급합니다. 그 의미가 무엇인지 아십니까? 더 자세한 정보를 찾을 수 없습니다. 문제는 그 논문이 내 작은 머리에 비해 너무 복잡해서 더 많은 정보를 찾으려고 노력하고 있다는 것이다.
Ecir Hana

-3

이것이 도움이되는지 모르겠지만 이 의견이 끝날 때 누군가 PHP에서 원하는 것을 구현합니다. 아마도 당신은 알고리즘을 알아낼 수 있습니다.


4
주석에서 그들은 원하는 줄 수만큼 남은 줄을 잘라 버렸습니다. 그들은 PHP를 사용하는데 wordwrap(), 이는 랩핑을 위해 탐욕스러운 (즉, "균등하지 않은") 알고리즘을 사용합니다. 그럼에도 불구하고 의문은의 $width주장 을 "추측"하는 방법으로 남아있다 wordwrap(). 어쨌든 회신 주셔서 감사합니다!
Ecir Hana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.