Một trường hợp phân biệt về lập trình động: Ví dụ cần thiết!


19

Tôi đã làm việc về lập trình động một thời gian. Cách chính tắc để đánh giá đệ quy lập trình động là bằng cách tạo một bảng gồm tất cả các giá trị cần thiết và điền vào từng hàng. Xem ví dụ Cormen, Leiserson et al: "Giới thiệu về thuật toán" để biết giới thiệu.

Tôi tập trung vào sơ đồ tính toán dựa trên bảng theo hai chiều (điền theo từng hàng) và nghiên cứu cấu trúc của các phụ thuộc ô, tức là các ô nào cần được thực hiện trước khi có thể tính toán các ô khác. Chúng tôi biểu thị với tập các chỉ số của các tế bào tế bào i phụ thuộc vào. Lưu ý rằng Γ cần phải được chu kỳ miễn phí.Γ(i)iΓ

Tôi trừu tượng từ chức năng thực tế được tính toán và tập trung vào cấu trúc đệ quy của nó. Chính thức, tôi coi việc tái diễn lập trình động nếu nó có dạngd

d(i)=f(i,Γ~d(i))

với , ~ Γ d ( i ) = { ( j , d ( j ) ) | jΓ d ( i ) }f một số chức năng (tính toán) mà không làm sử dụng d khác hơn là qua ~ Γ d .i[0m]×[0n]Γ~d(i)={(j,d(j))jΓd(i)}fdΓ~d

Khi hạn chế granularity của đến các vùng khó khăn (bên trái, phía trên bên trái, hàng đầu, phía trên bên phải, ... của tế bào hiện hành) một nhận xét rằng về cơ bản có ba trường hợp (lên đến đối xứng và xoay) của giá trị thu hồi lập trình động thông báo làm thế nào bảng có thể được điền:Γd

Ba trường hợp phụ thuộc tế bào lập trình động

Các khu vực màu đỏ biểu thị (overapproximations của) . Trường hợp một và hai thừa nhận tập hợp con, trường hợp ba là trường hợp xấu nhất (chuyển đổi chỉ số). Lưu ý rằng nó không phải là yêu cầu nghiêm ngặt rằng toàn bộ khu vực màu đỏ được bao phủ bởi Γ ; một số ô trong mỗi phần màu đỏ của bảng là đủ để tô màu đỏ. Các khu vực màu trắng được yêu cầu rõ ràng để không chứa bất kỳ tế bào cần thiết.ΓΓ

Ví dụ cho trường hợp một là khoảng cách chỉnh sửachuỗi con chung dài nhất , trường hợp hai áp dụng cho Bellman & FordCYK . Các ví dụ ít rõ ràng hơn bao gồm các hoạt động trên các đường chéo thay vì các hàng (hoặc cột) vì chúng có thể được xoay để phù hợp với các trường hợp được đề xuất; xem câu trả lời của Joe cho một ví dụ.

Tôi không có ví dụ (tự nhiên) cho trường hợp ba, mặc dù! Vì vậy, câu hỏi của tôi là: ví dụ cho trường hợp ba vấn đề / vấn đề lập trình động là gì?


2
Trường hợp 3 bao gồm các trường hợp 1 và 2.
JeffE

Không, nó không, mặc dù ngoại hình. Ví dụ, một trường hợp trường hợp 1 không thể có một tế bào cần thiết trong khu vực phía trên bên trái, trong khi một trường hợp case 3 để có một tế bào cần thiết trong khu vực phía trên bên trái. Tôi chỉnh sửa lời giải thích để làm rõ.
Raphael

Câu trả lời:


15

Có rất nhiều ví dụ khác về các thuật toán lập trình động hoàn toàn không phù hợp với mô hình của bạn.

  • Vấn đề tiếp theo tăng dài nhất chỉ cần một bảng một chiều.

  • Có một số thuật toán lập trình động tự nhiên có các bảng yêu cầu ba hoặc thậm chí nhiều chiều hơn. Ví dụ: Tìm hình chữ nhật màu trắng diện tích tối đa trong bitmap. Thuật toán lập trình động tự nhiên sử dụng bảng ba chiều.

  • (1+ϵ)


Cảm ơn câu trả lời của bạn, nhưng tôi đã hạn chế rõ ràng câu hỏi cho các vấn đề hai chiều và sơ đồ tính toán dựa trên bảng chính tắc (được chỉnh sửa để làm cho điểm đó rõ ràng hơn). Tôi nhận thức được khuôn khổ chung hơn nhưng không quan tâm đến nó ở điểm này.
Raphael

9
Được rồi, nhưng tôi thực sự nghĩ rằng bạn đang thiếu điểm.
JeffE

Vì có nhiều upvote, tôi nghĩ tôi nên làm rõ điều này: Bài đăng này không trả lời câu hỏi và thực tế nó thậm chí không cố gắng.
Raphael

2
@Raphael là chính xác. "Câu trả lời" của tôi không phải là một câu trả lời mà là một lời chỉ trích câu hỏi, nhưng nó quá dài cho một bình luận.
JeffE

3

A(m,n)A(m,n1)A(m1,k)k

Điều này không lý tưởng phù hợp với các yêu cầu, vì số lượng cột là vô hạn và việc tính toán thường được thực hiện từ trên xuống với việc ghi nhớ, nhưng tôi nghĩ rằng nó đáng để đề cập.


1
A(m1,A(m,n1))

1
Không chắc chắn tại sao câu trả lời này đã bị đánh giá thấp, vì nó là một câu trả lời tốt. Hàm Ackermann cho vay rất tốt cho lập trình động. Nói chung, bất kỳ hàm được định nghĩa đệ quy nào được tính toán lặp đi lặp lại cho cùng một đối số đều cho vay lập trình động. Để thấy điều này chỉ cần thực hiện nó và so sánh thời gian chạy. Phải mất nhiều năm để tính toán với hàm Ackermann thông thường có thể mất vài giây với chương trình động.
Jules

@Jules: Vấn đề đối với sơ đồ bảng chính tắc là bạn không biết một (đệ quy nguyên thủy) bị ràng buộc trên kích thước bảng một tiên nghiệm. Tất nhiên bạn có thể làm được, nhưng không hoàn toàn theo cách thông thường. Vì vậy, có, nó có thể khả thi cho DP nhưng nó không phù hợp với loại vấn đề mà câu hỏi của tôi quan tâm.
Raphael

1
Tôi không nghĩ rằng đó là một yêu cầu cho DP rằng bạn có một ưu tiên ràng buộc về kích thước bảng? Trong thực tế như JeffE đề cập, bộ đệm hoàn toàn không phải là một bảng. Nó có thể là bất kỳ cấu trúc dữ liệu liên kết. DP thực sự là một ý tưởng rất đơn giản: bạn muốn tính toán một hàm được định nghĩa đệ quy, nhưng hàm này được gọi liên tục trên cùng một đối số. DP là tối ưu hóa nơi bạn giới thiệu bộ đệm để đảm bảo bạn chỉ tính toán từng trường hợp một lần. Có rất nhiều hàm phù hợp với cả hai trường hợp của bạn, ngay cả khi chúng là các hàm của hai số nguyên giới hạn.
Jules

2

Điều này không phù hợp với trường hợp 3 chính xác, nhưng tôi không biết liệu có trường hợp nào của bạn nắm bắt được một vấn đề rất phổ biến được sử dụng để dạy lập trình động hay không: Phép nhân chuỗi ma trận . Để giải quyết vấn đề này, (và nhiều vấn đề khác, đây chỉ là vấn đề chính tắc) chúng tôi điền vào đường chéo ma trận theo đường chéo thay vì từng hàng.

Vì vậy, quy tắc là một cái gì đó như thế này:

diagMatrix


1
Viết như thế này nó thực sự không phù hợp với bất kỳ trường hợp. Tuy nhiên, nếu bạn xoay theo chiều kim đồng hồ 45 độ, bạn sẽ gặp trường hợp 2 (và tất cả các thuộc tính ngụ ý). Điều này đúng cho các ví dụ khác cũng hoạt động từ đường chéo đến một góc. Nhưng cảm ơn vì đã đề cập đến nó!
Raphael

@Raphael không rõ ràng ngay lập tức rằng những điều này là tương đương, bạn có thể muốn đề cập đến điều đó trong câu hỏi của bạn.
Joe

0

Tôi biết đó là một ví dụ ngớ ngẩn, nhưng tôi nghĩ một vấn đề lặp đơn giản như

Tìm tổng các số trong một ma trận vuông

có thể đủ điều kiện. Kiểu "cho mỗi hàng cho mỗi cột" truyền thống trông giống như trường hợp 3 của bạn.


-1

Đây chính xác không phải là không gian tìm kiếm mà bạn đang tìm kiếm nhưng tôi có một ý tưởng về đỉnh đầu của tôi có thể giúp ích.

Vấn đề :

n×nMxM

Câu trả lời

Điều này có thể được giải quyết theo cách đệ quy sau:

k=1+n2xmk,kx<mk,kmi,jkinkjn1/4x>mk,k1/434n2x(34)3n2


1
Đây không phải là một ví dụ của lập trình động, phải không?
Raphael
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.