Thuật toán tham lam và nguyên lý lựa chọn tham lam

MỤC LỤC

CÁC THÀNH PHẦN CỦA CHIẾN LƯỢC THAM LAM

Tính lựa chọn tham lam

Vì vậy, không giống quy hoạch động, nó giải quyết các bài toán con từ dưới lên, một chiến lược tham lam thường giải quyết theo kiểu từ trên xuống, thực hiện một lựa chọn tham lam sau một chọn lựa khác, liên tục rút gọn từng trường hợp bài toán đã cho thành một bài toán nhỏ hơn. Nó thường là trường hợp mà được xử lý trước khi đưa vào hay sử dụng một cấu trúc dữ liệu thích hợp (thường một hàng đợi ưu thế), ta có thể thực hiện các lựa chọn tham lam nhanh chóng, vì vậy đưa ra một thuật toán hiệu quả.

Cấu trúc con tối ưu

Ví dụ, trong bài toán chọn hoạt động, giả sử rằng ta có các hoạt động được sắp xếp sẵn theo thứ tự tăng dần của thời điểm kết thúc, ta cần kiểm tra mỗi một hoạt động. Tất cả ta thật sự cần làmlà cho rằng một giải pháp tối ưu đối với bài toán con, kết hợp với lựa chọn tham lam vừa được thực hiện, mang lại một giải pháp tối ưu đối với bài toán ban đầu.

Thuật toán tham lam mâu thuẫn với quy hoạch động

Trong bài toán chiếc ba lô phân số tương thích, giả sử rằng nếu ta bỏ lại trọng lượng wcủa một món hàng j khỏi tải trọng tối ưu, tải trọng còn lại phải là tải trọng có giá trị nhất cân nặng nhiều nhất là W-w mà tên trộm có thể lấy từ n-1 món hàng ban đầu cộng với wj-wpound của món hàng j. Trong bài toán 0-1, khi ta xem một món hàng cho vào chiếc ba lô, ta phải so sánh giải thuật đối với bài toán con trong đó món hàng được tính đến với giải thuật đối với bài toán con trong đó món hàng được tính đến trước khi ta có thể thực hiện lựa chọn.

Hình 16.2: Chiến lược tham lam không thực hiện trong bài toán chiếc ba lô 0-1. (a)  tên trộm phải chọn một tập con của ba món hàng mà khối lượng của chúng không vượt  quá 50 pound
Hình 16.2: Chiến lược tham lam không thực hiện trong bài toán chiếc ba lô 0-1. (a) tên trộm phải chọn một tập con của ba món hàng mà khối lượng của chúng không vượt quá 50 pound

MÃ HUFFMAN

Mã tiền tố

Vì rằng không có từ mã nào là tiền tố của bất kỳ từ mã khác, nên từ mã bắt đầu một tập tin được mã hoá là rất rừ ràng. Ta cú thể nhận biết một cỏch đơn giản từ mó lỳc đầu, dịch nú trở lại ký tự gốc ban đầu, và lặp lại quy trình giải mã đối với phần còn lại của tập tin đã mã hoá. Lưu ý rằng những cây này không là cây nhị phân tìm kiếm, những lá không cần xuất hiện trong thứ tự sắp xếp và những nút trong không chứa khoá ký tự.

Một mã tối ưu cho một tập tin luôn luôn được biểu diễn bằng một cây nhị phân đầy đủ, trong đó mọi nút không là lá đều có 2 con (xem bài tập 16.3-1). Mã có chiều dài cố định trong ví dụ của ta là không tối ưu vì rằng cây của nó thể hiện ở minh hoạ 16.4(a) không phải là cây nhị phân đầy đủ: có những từ mã bắt đầu 10… nhưng không bắt đầu 11…Vì rằng bây giờ ta có thể hạn chế chú ý vào các cây nhị phân đầy đủ, nên có thể nói rằng nếu C là bảng chữ cái từ những ký tự được cho trước và tất cả tần số ký tự là xác định, thì cây cho một mã tiền tố tối ưu có chính xác là C lá, mỗi lá cho một ký tự của bảng chữ cái, và có đúng C −1 nút trong (xem Bài tập B.5-3). Với mỗi ký tự c trong bảng chữ cái C, đặt f(c) là tần số của c trong tập tin đó và đặt dT(c) là độ sâu của lá chứa ký tự c trên cây.

Xây dựng mã Huffman

Minh hoạ 16.5: Các bước của giải thuật Huffman với tần số được cho trong minh hoạ 16.3 mỗi đường đi chỉ ra nội dung của chuỗi được sắp xếp theo thứ tự tăng dần của tần số. Nút ngoài cùng kết nối với nút trong bởi các con của nó có nhãn là 0 nếu đó là cạnh đi đến nút con trái và 1 nếu đó là cạnh đi đến nút con phải. Vòng For ở dòng 3-8 lặp lại nhiều lần động tác trích ra 2 nút x và y có tần số thấp nhất trong hàng đợi, và thay thế chúng trong hàng đợi với một nút mới z thực hiện kết hợp chúng với nhau.

Sau n-1 phép kết hợp, nút thứ nhất trái được để lại trong hàng đợi - gốc của cây mã hoá - được trả về giá trị ở dòng 9. Cho một tập hợp C gồm n ký tự, giá trị ban đầu của Q ở dòng 2 có thể được thực hiện trong O(n) thời gian dùng cho thủ tục BUILD_MIN_HEAP trong phần 6.3. Vòng Forở dòng 3-8 được thực hiện chính xác là n-1 lần, và bởi vì mỗi phép toán đống yêu cầu thời gian là O(lgn), nên vòng lặp đóng góp O(nlgn) vào thời gian chạy thuật toán.

Tính đúng đắn của giải thuật Huffman

Phân tích thời gian chạy giải thuật Huffman cho thấy rằng Q được thực hiện như một đống nhị phân (xem Chương 6). Các lá x và y là hai lá mà giải thuật Huffman kết hợp với nhau đầu tiên; chúng xuất hiện ở các vị trí tuỳ ý trên T. Vì vậy, T” là cây tối ưu trong đó x và y xuất hiện như những lá anh em ruột có chiều sâu cực đại, mà bổ đề theo.

Bổ đề 16.2 hàm ý rằng quá trình xây dựng một cây tối ưu bởi các phép kết hợp có thể, không mất tính tổng quát, bắt đầu với một lựa chọn tham lam của tiến kết hợp hai ký tự có tần số thấp nhất với nhau. Ta có thể xem mức hao phí của phép kết hợp đơn lẻ dưới dạng tổng của các tần số của hai phần tử được kết hợp. Chứng minh: Đầu tiên ta chỉ ra rằng giá trị B(T) của cây T có thể được thể hiện dưới dạng mức hao phí B(T’) của cây T’ bằng cách xét các mức hao phí thành phần trong phương trình (16.5).

Minh hoạ 16.6: Hình ảnh minh hoạ bước mấu chốt trong chứng minh của Bổ  đề 16.2.
Minh hoạ 16.6: Hình ảnh minh hoạ bước mấu chốt trong chứng minh của Bổ đề 16.2.

CƠ SỞ LÝ THUYẾT CỦA PHƯƠNG PHÁP THAM LAM

Matroid

(Để chứng minh điều này bằng cách khác, bắt đầu từ V cây, mỗi cây bao gồm nhiều đỉnh và không có cạnh nào. Sau đó, mỗi cạnh được thêm vào rừng sẽ làm giảm số lượng cây là một). Vì rằng rừng GB có một số cây nhiều hơn rừng GA, rừng GB có chứa một cây T mà đỉnh của nó là ở hai cây khác nhau trong rừng GA. Nếu A là tập hợp các cạnh độc lập thì cạnh e là phần tử mở rộng của A nếu và chỉ nếu e không thuộc A và khi thêm e vào A thì không tạo chu trình.

Thì tính chất trao đổi chỉ ra rằng A được mở rộng thành một tập độc lập lớn hơn A∪{x}với x∈ −B A, điều này mâu thuẫn với giả thiết A là lớn nhất. Ta nói rằng một matroid M=(S,l) là có trọng số nếu có một hàm liên quan đến trọng lượng ω nhận một trọng số hoàn toàn dương ω( )x đối với mỗi phần tử x∈S. Ví dụ, nếu ta đặt ω( )e là độ dài của cạnh e trong matroid đồ thị MG, thì ω( )A là tổng độ dài của các cạnh trong tập cạnh A.

Giải thuật tham lam trên một matroid trọng số

Thuật toán là tham lam bởi vì nó xem mỗi phần tử x S∈ lần lượt được sắp xếp theo trọng số giảm dần đều và trực tiếp cộng nó vào tập A đang được tích luỹ nếu A∪{x} là độc lập. Bởi vì tập rỗng là độc lập bởi định nghĩa về matroid và x được thêm vào A với điều kiện A ∪{x} là độc lập, nên tập con A luôn luôn độc lập bằng phương pháp qui nạp. Áp dụng tính chất trao đổi, lặp lại việc tìm một phần tử mới của B sao cho có thể thêm vào A cho đến khi A = B trong khi vẫn giữ được tính độc lập của A.

Vì vậy, GREEDY không thể gây ra lỗi bởi việc bỏ qua những phần tử ban đầu bất kỳ trong S mà không là một mở rộng của ∅, vì rằng chúng không bao giờ được sử dụng. Chứng minh: Với hệ quả 16.9, bất cứ phần tử nào mà được bỏ qua lúc đầu bởi vì chúng không phải là mở rộng của ∅ không hữu dụng nên không bao giờ xét lại nữa. Vì vậy, phép tính tiếp theo của GREEDY sẽ tìm ra tập con độc lập có trọng số lớn nhất của M’, và phép tính toàn diện của GREEDY sẽ tìm ra một tập con độc lập có trọng số cực đại của M.

BÀI TOÁN LẬP LỊCH LÀM VIỆC

Bổ đề 16.12

Với một tập A bất kỳ gồm các công việc, các mệnh đề sau là tương đương. Nếu các công việc trong A được sắp xếp theo thứ tự tăng dần về thời hạn kết thúc thì không có công việc nào trễ. Chứng minh: Rừ ràng, nếu Nt(A) >t với t nào đú, thỡ khụng cú cỏch nào để lập lịch làm việc mà không có một công việc trễ nào đối với A, bởi vì có nhiều hơn t công việc hoàn thành trước thời gian t.

Nếu (2) có giá trị thì (3) xảy ra: không có cách nào để “get stuck” khi việc lên lịch các công việc theo thứ tự tăng dần về thời hạn. Bài toán tối thiểu hoá tổng số tiền phạt của những công việc trễ giống như bài toán cực đại hoá tổng số tiền phạt của những công việc sớm. Định lý sau đây đảm bảo rằng ta có thể sử dụng thuật toán tham lam để tìm ra một tập độc lập.

Định lý 16.13

Minh hoạ 16.7 đưa ra một ví dụ về bài toán lập lịch các công việc với các thời hạn kết thúc và số tiền phạt đối với bộ xử lý đơn. Minh hoạ 16.7: Một ví dụ của bài toán lập lịch các công việc với các thời hạn kết thúc và các số tiền phạt cho bộ xử lý đơn.