Chia văn bản thành nhiều dòng nhất định


12

Có một thuật toán thời gian tuyến tính để chia văn bản thành các dòng có chiều rộng tối đa. Nó sử dụng SMAWK (hoặc Knuth & Plass) và "đều" có nghĩa là: http://en.wikipedia.org/wiki/Word_wrap#Minimum_raggedness

Có một thuật toán hoặc hàm chi phí lõm cho thuật toán ở trên có tính đến số lượng dòng tôi muốn văn bản đột nhập, thay vì độ rộng dòng tối đa không? Còn trong thời gian tuyến tính?

Nói cách khác, tôi đang tìm kiếm thuật toán ngắt dòng (hoặc tạo đoạn hoặc gói từ) trong đó đầu vào là số dòng mong muốn, không phải độ rộng dòng mong muốn.

Chỉ để mô tả một cách tiếp cận thực tế không thể sử dụng: Có N từ và khoảng trắng N-1 ở giữa mỗi cặp từ, M là số dòng mong muốn (M <= N). Sau mỗi khoảng trắng, có thể có nhiều nhất một (có thể bằng không) ngắt dòng. Bây giờ, thuật toán sẽ cố gắng đặt các khoảng nghỉ trong mỗi kết hợp có thể, tính toán "độ rách" và trả về kết quả tốt nhất. Làm thế nào để làm điều đó nhanh hơn nhiều?

Ngoài ra, một vấn đề như vậy có một tên? "Gia đình" của vấn đề gì nó thuộc về? (Ví dụ: "đóng gói bin") Nếu tôi không cần giải pháp tối ưu hoàn hảo, chỉ cần một giải pháp rất tốt, liệu có thể giải quyết nhanh hơn nhiều không? (một số dạng heuristic có thể sử dụng được, nếu với một đầu vào nhất định, luôn có cùng một giải pháp, có thể là tối ưu phụ,).

Cập nhật

Chandra Chekuri đề nghị dưới đây "một vấn đề trong chương Kleinberg và Tardos về lập trình động". Đó là một bài đọc tốt nhưng nó liên quan đến việc ngắt dòng dựa trên chiều rộng thay vì đếm dòng. Nó có thể thích ứng với vấn đề này, đây là điều mà tôi đang cố gắng tìm ra bây giờ. Đây là một liên kết tốt đến giải pháp, họ thậm chí còn yêu cầu giải quyết nó trong thời gian tuyến tính: http://web.media.mit.edu/~dlanman/cifts/cs157/HW5.pdf

Ngoài ra, có một chương "8,5 Vấn đề phân vùng" trong Hướng dẫn thiết kế thuật toán của Skiena dường như chính xác về chủ đề, tôi vẫn đang đọc nó, rất khó. (Thật không may, từ những gì tôi hiểu nó có độ phức tạp thời gian bậc hai)


5
Vấn đề lập trình năng động tốt đẹp! Tôi có thể sử dụng nó như bài tập về nhà trong học kỳ tiếp theo.
Jeffε

3
@ Jɛ E nếu bạn muốn sử dụng nó cho một vấn đề bài tập về nhà, tốt hơn nên đóng câu hỏi trước khi câu trả lời được công bố trên web.
Joe

1
@Joe: là một người thực sự quan tâm đến câu trả lời, tôi thích câu hỏi được trả lời hơn là đóng.
Ecir Hana

2
@Joe: đó không phải là bài tập về nhà, tôi thậm chí không học CS. "Cấp độ bài tập về nhà" là gì, tôi thấy rất thú vị khi một số người thậm chí không thể hình dung được cách giải quyết vấn đề, trong khi những người khác coi đó là "cấp độ bài tập về nhà". Điều đó nói rằng, câu trả lời có thể bị xóa trong một tuần hoặc gửi đến email của tôi chẳng hạn. Và tôi cũng sẽ biết ơn vì không "trả lời đầy đủ".
Ecir Hana

3
Có một vấn đề trong chương Kleinberg và Tardos về lập trình động, đó là định dạng theo cách để giảm thiểu tổng số độ chùng trong các dòng.
Chandra Chekuri

Câu trả lời:


4

MÔi(Nđăng nhậpBạn)BạnN2Ôi(đăng nhậpMđăng nhậpđăng nhậpN)M= =Ω(đăng nhậpN)

MM


Tôi rất xin lỗi nhưng tôi không nghĩ rằng tôi làm theo. Là "trọng lượng cạnh" chiều dài của một từ? "Đồ thị" trông như thế nào? Có phải nó chỉ là một biểu đồ tuyến tính trong đó các nút là điểm dừng và các cạnh là độ dài của các từ? Và "đường dẫn liên kết M" này phá vỡ nó để các phân đoạn kết quả có tổng số cạnh tối thiểu? Nhưng quan trọng nhất, trong câu đầu tiên - tôi không chắc mình có thể tính toán được sự rách rưới một cách độc lập hay không. Nó đại khái là sự khác biệt giữa dòng dài nhất và dòng thực tế vì vậy tôi cần biết điều gì về các dòng khác, phải không? Hơn nữa cho dòng cuối cùng, xin vui lòng xem bình luận thứ 15 ở trên.
Ecir Hana

M1N+1(Tôi,j)Tôij-1
Jouni Sirén

@Ecir: Về cơ bản tất cả các thuật toán dựa trên lập trình động yêu cầu bạn có thể tính toán độ rách rưới của một dòng một cách độc lập. Nếu đó không phải là trường hợp, bạn có thể muốn sử dụng một cái gì đó giống như ý tưởng thứ hai của tôi: đoán độ rộng của dòng, tính toán một giải pháp dựa trên chiều rộng đó và lặp đi lặp lại để tìm giải pháp tốt hơn.
Jouni Sirén

cám ơn vì đã giải thích. Xin vui lòng, tôi có thêm hai câu hỏi: khi sử dụng tùy chọn "tìm kiếm nhị phân", tôi có thể làm gì để đảm bảo số M của các dòng không? Nếu tôi thêm epsilon ngẫu nhiên nhỏ vào mỗi chiều rộng của dòng để không có dòng nào có cùng chiều rộng, tôi có thể đạt được độ phân giải cao hơn qua việc đặt dấu ngắt.
Ecir Hana

Và trong trường hợp "đường dẫn liên kết M", cả hai bài báo đều đề cập rằng "thật dễ dàng để chỉ ra rằng đường dẫn liên kết K tối thiểu có thể được tính trong thời gian O (nK)" - bạn có biết ý nghĩa của chúng không? Tôi không thể tìm thấy bất kỳ thông tin thêm về nó. Vấn đề là, những bài báo đó hơi phức tạp một chút đối với cái đầu nhỏ bé của tôi nên tôi đang cố gắng tìm thêm thông tin, có thể là một triển khai, ...
Ecir Hana

-3

Tôi không biết nếu điều này có ích, nhưng đến cuối bình luận này, ai đó sẽ thực hiện những gì bạn muốn trong PHP; có lẽ bạn có thể tìm ra thuật toán.


4
Trong phần bình luận họ chỉ cắt bỏ các dòng còn lại sau số dòng mong muốn. Họ sử dụng PHP wordwrap(), lần lượt sử dụng thuật toán tham lam (tức là không có "đồng đều") để gói. Ngay cả khi đó, câu hỏi vẫn là làm thế nào để "đoán" $widthlập luận của wordwrap(). Nhưng dù sao cũng cảm ơn bạn đã trả lời!
Ecir Hana
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.