1. Trang chủ
  2. » Luận Văn - Báo Cáo

Tiểu luận môn học THIẾT KẾ VÀ PHÂN TÍCH THUẬT TOÁN CÂY KHUNG NHỎ NHẤT

19 1,1K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 19
Dung lượng 0,95 MB

Nội dung

Ta có thể mô hình hoá bài toán bằng một đồ thị liên thông vô hướng G=V,E với V là tập các đỉnh ứng với các pin, E là tập các cạnh ứng với các dây nối giữa các pin, và mỗi cạnh u,v ∈ E, t

Trang 1

Cây khung nhỏ nhất

Trong bảng thiết kế mạch điện, việc nối các pin với nhau để chúng tương đương với nhau về điện thế bằng cách mắc các dây điện với nhau là một bài toán thiết yếu Để kết nối một tập gồm n pin, ta có thể sử dụng một cách sắp xếp n-1 dây, mỗi dây kết nối hai pin với nhau Trong tất cả các cách sắp xếp, vấn đề đặt ra là tìm cách sắp xếp sao cho lượng dây sử dụng là ít nhất

Ta có thể mô hình hoá bài toán bằng một đồ thị liên thông vô hướng G=(V,E) với V

là tập các đỉnh ứng với các pin, E là tập các cạnh ứng với các dây nối giữa các pin, và mỗi cạnh (u,v) ∈ E, trọng số w(u,v) thể hiện chi phí (lượng dây cần thiết) để nối u và v Vấn đề đặt ra là tìm được một tập T⊆ E bao gồm các cạnh không tạo thành chu trình

sao cho tổng trọng số w(T)= là nhỏ nhất Bởi vì tập các cạnh trong T không tạo

thành chu trình và nối với tất cả các đỉnh của đồ thị, do đó T tạo thành một cây mà ta gọi

là cây khung bao trùm đồ thị G Ta gọi bài toán xác định T là bài toán tìm cây khung nhỏ nhất Hình vẽ 23.1 là ví dụ cây khung nhỏ nhất của đồ thị liên thông

Trong chương này, ta sẽ nghiên cứu hai thuật toán để giải quyết bài toán cây khung

nhỏ nhất: thuật toán Kruskal và Prim Thời gian thực hiện của mỗi thuật toán là O(E lg V) sử dụng đống nhị phân thông thường Bằng cách sử dụng thuật toán vun đống

Fibonacci, thuật toán Prim có thể cải tiến được thời gian thực hiện là O(E+V lg V), đây là

sự cải tiến trong trường hợp [V] nhỏ hơn nhiều so với [E]

Hai thuật toán Kruskal và Prim là các thuật toán tham lam, thuật toán tham lam được

mô tả ở chương 16 Ở mỗi bước của thuật toán, ta có thể có nhiều sự lựa chọn khác nhau Phương pháp “tham lam” đưa ra cách lựa chọn tốt nhất tại thời điểm đang xét Nhưng xét một cách tổng quát phương pháp tham lam không đảm bảo tìm ra các giải pháp tối ưu cho các bài toán Tuy nhiên đối với bài toán cây khung nhỏ nhất, ta có thể chứng minh phương pháp tham lam chắc chắn đưa ra một cây khung có trọng số nhỏ nhất Mặc dù chương này có thể độc lập với chương 16, nhưng phương pháp tham lam thể hiện ở đây

là một ứng dụng kinh điển của các khái niệm lý thuyết đã được giới thiệu ở chương 16

Σw(u,v)

(u,v) Є T

2

1

4

6

7 8

2

14

4

10

9

a

b

h

c

g

d

f

e i

7

11

8

Trang 2

Hình 23.1 Cho một cây khung nhỏ nhất của đồ thị liên thông Mỗi cạnh được biểu diễn bới một trọng số và các cạnh của cây khung nhỏ nhất là các cạnh được tô bóng Tổng trọng số của cây khung này là 37 Cây khung nhỏ nhất này là không duy nhất: xoá cạnh (b,c) và thay nó thành cạnh (a,h) ta vẫn nhận được cây khung khác có trọng số 37.

Phần 23.1 giới thiệu một thuật toán cây khung nhỏ nhất tổng quát để phát triển cây khung nhỏ nhất bằng cách tại một thời điểm ta bổ sung một cạnh Phần 23.2 đưa ra hai cách để thực hiện thuật toán tổng quát Thuật toán đầu tiên là thuật toán Kruskal là tương đương với thuật toán các thành phần liên thông ở phần 21.1 Thuật toán thứ hai là thuật toán Prim tương tự với thuật toán tìm đường đi ngắn nhất Dijkstra(phần 24.3)

23.1 Phát triển cây khung nhỏ nhất

Giả sử cho một đồ thị liên thông vô hướng G=(V,E) và một hàm trọng số w: E R,

ta muốn tìm cây khung nhỏ nhất cho đồ thị G Hai thuật toán ta sẽ nghiên cứu trong chương này sử dụng phương pháp tham lam cho bài toán cây khung nhỏ nhất, tuy nhiên hai thuật toán khác nhau ở điểm làm thế nào để ứng dụng phương pháp tham lam vào mỗi thuật toán

Thuật toán tổng quát sau được giải quyết bằng phương pháp tham lam để phát triển cây khung nhỏ nhất đối với một cạnh tại một thời điểm Thuật toán quản lý một tập các cạnh A duy trì tính bất biến của vòng lặp sau

Trước mỗi bước lặp, A là tập con của cây khung nhỏ nhất nào đó

Ở mỗi bước, ta xác định một cạnh (u,v) có thể được bổ sung vào A nhưng không phá

vỡ tính chất bất biến của tập A, điều đó có nghĩa là A U {(u,v)} vẫn là tập con của cây khung nhỏ nhất Ta gọi cạnh như vậy là cạnh an toàn cho A, bởi vì cạnh này có thể được

bổ sung một cách an toàn vào A nhưng vẫn duy trì được tính chất của A

GENERIC – MST (G,w)

1 A Ø

2 while A does not form a spanning tree

3 do find an edge (u,v) that is safe for A

4 AAU{(u,v)}

5 return A

Ta sử dụng vòng lặp bất biến như sau:

Ban đầu: Trong khi A chưa tạo thành cây khung nhỏ nhất

Trang 3

Duy trì: Vòng lặp từ dòng 2 đến 4 duy trì tính chất của A bằng cách chỉ bổ sung các cạnh an toàn vào tập A

Kết thúc: Tất cả các cạnh bổ sung vào tập A là cây khung nhỏ nhất Tập A được trả

về là một cây khung nhỏ nhất

Tuy nhiên, việc xác định một cạnh an toàn ở dòng 3 là một vấn đề không đơn giản

Sự tồn tại của một cạnh an toàn là chắc chắn bởi vì khi thực hiện dòng thứ 3 của thuật toán, tính bất biến sẽ dẫn đến sự tồn tại một cây khung T sao cho A⊆ T Trong vòng lặp while, A phải là tập con thực sự của T vì vậy nếu cạnh (u,v)∈T mà (u,v)∉A thì (u,v) là

an toàn của A

Trong phần còn lại của phần này, ta đưa ra một quy tắc (Định lý 23.1) để nhận biết các cạnh an toàn Phần tiếp theo mô tả hai thuật toán sử dụng nguyên tắc này để tìm ra các cạnh an toàn một cách hiệu quả

Đầu tiên ta cần định nghĩa một số khái niệm sau, một phép cắt (S,V-S) của đồ thị vô hướng G=(V,E) là một phân chia của V Hình 23.2 là ví dụ minh họa của phép cắt (S,V-S) Ta nói một cạnh (u,v) ∈ E xuyên qua phép cắt (S,V-S) nếu có đỉnh cuối thuộc S và đỉnh còn lại thuộc V-S Một phép cắt bảo toàn tập các cạnh A nếu không có cạnh nào của

A xuyên qua phép cắt Một cạnh là được gọi là cạnh nhẹ (light edge) xuyên qua phép cắt nếu trọng số của nó là nhỏ nhất trong mọi trọng số của các cạnh xuyên qua phép cắt Lưu

ý rằng có thể có nhiều hơn một cạnh nhẹ xuyên qua một phép cắt trong trường hợp liên kết.Thông thường, một cạnh là một cạnh nhẹ thoả mãn một tính chất nào đó nếu trọng số

của cạnh đó là nhỏ nhất của tất cả các cạnh thoả mãn tính chất đó Nguyên tắc để nhận

biết các cạnh an toàn cho bởi định lý sau:

Định lý 23.1

Cho G=(V,E) là một đồ thị liên thông, vô hướng với hàm trọng số w định nghĩa trên

E Cho A là tập con của E gồm các cây khung nhỏ nhất của G, cho (S, V-S) là phép cắt bất kỳ của đồ thị G và bảo toàn tập các cạnh A, đặt (u,v) là cạnh nhẹ (light edge) xuyên qua (S,V-S) Vậy cạnh (u,v) là cạnh an toàn của A

Chứng minh Cho T là một cây khung nhỏ nhất chứa tập A, giả sử T không chứa cạnh nhẹ (u,v) , bởi vì nếu T chứa cạnh nhẹ điều đó có nghĩa ta chứng minh xong Ta sẽ xây dựng cây khung nhỏ nhất khác T’ mà chứa AU{(u,v)} bằng cách sử dụng kỹ thuật cắt dán, do đó ta có (u,v) là một cạnh an toàn của A

Trang 3

a

e

4

6

7 8

14

4

10

9

h

c

g i

2

7

11

8

S

V-S

Trang 4

(b)

Hình 23.2 Hai hình vẽ trên là phép cắt (S,V-S) của đồ thị ở hình 23.1 (a) Các đỉnh thuộc tập

S được tô màu đen, và các đỉnh thuộc tập V-S là màu trắng Các cạnh xuyên qua phép cắt là sự kết nối giữa các đỉnh trắng và đỉnh đen Cạnh (d,c) là cạnh nhẹ duy nhất đi qua phép cắt Tập con A bao gồm các cạnh được tô bóng lưu ý ở đây phép cắt (S,V-S) là phép cắt bảo toàn các cạnh A bởi vì không có cạnh nào của A xuyên qua phép cắt (b) đối với đồ thị ở hình (a) các đỉnh trong tập S ở bên trái và các đỉnh trong tập V-S ở bên phải Một cạnh xuyên qua phép cắt nếu nó nối một đỉnh bên trái và một đỉnh bên phải.

Cạnh (u,v) biểu diễn một chu trình bao gồm các cạnh trên đường dẫn p từ u tới v trong T, như minh họa ở hình 23.3 Bởi vì u và v là các đỉnh đối nhau của phép cắt (S,V-S), do đó có ít nhất một cạnh trong T trên đường dẫn p cũng xuyên qua phép cắt

d

e

a

b

c

f

4 9

8

7

14

10

h

g

i

6 4

7

11

8

2

1

2

S V-S

Trang 5

Cho (x,y) là cạnh bất kỳ thoả mãn các tính chất trên Cạnh (x,y) không thuộc A do phép cắt bảo toàn các cạnh của tập A Bởi vì (x,y) nằm trên đường dẫn duy nhất từ u đến v trong T, xoá (x,y) tách T thành hai phần Thêm (u,v) tạo thành một cây khung mới T’ =T-{(x,y)}U {(u,v)}

Ta tiếp tục biểu diễn T’ là cây khung nhỏ nhất Bởi vì (u,v) là cạnh nhẹ xuyên qua

(S,V-S) và (x,y) cũng xuyên qua phép cắt do đó w(u,v)≤w(x,y) Vì vậy:

w(T’) = w(T) - w(x,y) + w(u,v)

≤ w(T)

Do T là cây khung nhỏ nhất, vì vậy mà w(T)≤w(T’) Vì vậy T’ cũng là cây khung

nhỏ nhất

Hình 23.3 Chứng minh định lý 23.1 Các đỉnh thuộc S là màu đen và các đỉnh thuộc V-S là màu trắng Ta biểu diễn các cạnh trong cây khung nhỏ nhất T nhưng không biểu diễn các cạnh trong đồ thị G Các cạnh trong A được tô bóng và (u,v) là cạnh nhẹ xuyên qua phép cắt (S,V-S) Cạnh (x,y) là cạnh trên đường dẫn duy nhất p từ u đến v trên T Cây khung nhỏ nhất T’ chứa (u,v) và được thiết lập bằng cách xoá cạnh (x,y) từ T và thêm cạnh (u,v).

T’ vẫn duy trì được (u,v) là cạnh an toàn của tập A Ta có A⊆T’ bởi vì A⊆ T và (x,y) ⊈ A ; vì vậy A⋃{(u,v)} ⊆ T' Do đó T’ là cây khung nhỏ nhất, và (u,v) là cạnh an toàn của A

Định lý 23.1 giúp ta hiểu rõ cách thức thực hiện thuật toán GENERIC-MST trên đồ thị liên thông G=(V,E) Khi thuật toán bắt đầu thực hiện, A là tập các cạnh không tạo thành chu trình nếu không thì cây khung nhỏ nhất chứa A sẽ chứa một chu trình, điều

này dẫn đến mâu thuẫn Ớ bất kỳ thời điểm nào khi thực hiện thuật toán, đồ thị

GA=(V,A) là rừng và mỗi thành phần liên thông của GA là một cây (Một số cây có thể chỉ chứa một đỉnh, ví dụ khi thuật toán bắt đầu thực hiện: A là tập rỗng và rừng chứa [V] cây, mỗi cây cho mỗi đỉnh) Hơn thế nữa, bất kỳ cạnh an toàn (u,v) thuộc A nối với các

u

x

y

v

p

Trang 6

thành phần phân biệt của GA, bởi vì A⋃{(u,v)} phải là tập các cạnh không tạo thành chu trình

Vòng lặp từ dòng 2 – 4 của GENERIC MST được thực hiện [V] –1 lần ứng với mỗi [V]-1 cạnh của cây khung nhỏ nhất lần lượt được xác định thành công Ban đầu khi A=∅, có [V] cây trong GA, và số vòng lặp giảm xuống 1 Khi rừng chỉ chứa một cây duy nhất thì thuật toán kết thúc Hai thuật toán trong phần 23.2 sử dụng hệ quả của định lý 23.1

Hệ quả 23.2

Cho G=(V,E) là một đồ thị liên thông, vô hướng với hàm trọng số w định nghĩa trên

E Cho A là một tập con của E bao gồm một số cây khung nhỏ nhất cho đồ thị G, và cho C=(VC,EC) là một thành phần liên thông (cây) trong rừng GA=(V,A) Nếu (u,v) là cạnh nhẹ nối C với vài thành phần khác trong GA, thì (u,v) là cạnh an toàn của A

Chứng minh Phép cắt (VC,V-VC) bảo toàn các cạnh của tập A, và (u,v) là một cạnh nhẹ qua phép cắt này Vì thế (u,v) là cạnh an toàn của A

Bài tập

23-1-1

Đặt (u,v) là cạnh có trọng số nhỏ nhất của đồ thị G Chứng tỏ rằng (u,v) thuộc vào một cây khung nhỏ nhất nào đó của G

23-1-2

Giáo sư Sabatier đưa ra định lý đảo của định lý 23.1 như sau: đặt G = (V, E) là một đồ thị liên thông và vô hướng với một hàm trọng số giá trị thực w định nghĩa trên E Đặt A

là một tập con của E thuộc vào một cây khung nhỏ nhất nào đó của G, đặt (S, V-S) là phép cắt bất kỳ của G bảo toàn các cạnh của tập A, và đặt (u, v) là một cạnh an toàn của

A xuyên qua phép cắt (S, V-S) Do đó, (u,v ) là một cạnh nhẹ thuộc vào phép cắt Chứng minh rằng giả định của giáo sư Sabatier là không đúng bằng cách đưa ra một phản chứng 23-1-3

Chứng minh rằng nếu một cạnh (u,v) thuộc vào một cây khung nhỏ nhất nào đó thì nó

là một cạnh nhẹ (light) xuyên qua phép cắt của đồ thị

23-1-4

Cho một ví dụ đơn giản về một đồ thị liên thông sao cho với một tập cạnh (u,v): {Tồn tại một phép cắt (S, V-S) sao cho (u, v) là một cạnh nhẹ xuyên qua (S, V-S)} không tạo thành một cây khung nhỏ nhất

23-1-5

Trang 7

Cho e là một cạnh trọng số nhỏ nhất trên một chu trình nào đó của đồ thị liên thông G= (V,E) Chứng minh rằng có một cây khung nhỏ nhất của G’=(V, E-{e}) đồng thời là cây khung nhỏ nhất của G Tức là có một cây khung nhỏ nhất của G mà nó không chứa e 23-1-6

Chứng minh rằng có một đồ thị có duy nhất một cây khung nhỏ nhất nếu với mỗi phép cắt của đồ thị, có một cạnh nhẹ duy nhất đi qua phép cắt Chứng tỏ rằng điều ngược lại không đúng bằng cách đưa ra một phản chứng

23-1-7

Giả sử rằng nếu mọi cạnh của một đồ thị đều có trọng số là số dương thì bất kì tập con của tập cạnh nối tấ cả các đỉnh có tổng trọng số nhỏ nhất phải là một cây Cho một ví dụ

để chứng tỏ rằng kết luận tương tự không đúng nếu chúng ta cho phép một vài trọng số không phải là số dương

23-1-8

Đặt T là một cây khung nhỏ nhất của đồ thị G và L là một danh sách sắp xếp các trọng số cạnh của T Chứng tỏ rằng với bất kì cây khung nhỏ nhất khác T’ của G thì danh sách L cũng là danh sách sắp xếp các trọng số của các cạnh của T’

23-1-9

Đặt T là một cây khung nhỏ nhất của đồ thị G = (V, E), và đặt V’ là một tập con của V Đặt T’ là đồ thị con của T tạo thành từ V’, và đặt G’ là đồ thị con của G tạo thành từ V’ Chứng tỏ rằng nếu T’ là liên thông thì T’ là một cây khung nhỏ nhất của G’

23-1-10

Cho một đồ thị G và một cây khung nhỏ nhất T, giả sử rằng ta giảm trọng số của một trong các cạnh của T Chứng tỏ rằng T vẫn là cây khung nhỏ nhất của G Tổng quát hơn, đặt T là một cây khung nhỏ nhất của G với các trọng số cạnh được cho bởi hàm trọng số

w Chọn một cạnh (x, y)T và một số dương k, và định nghĩa hàm trọng số w’ bằng:

w’(u,v) =

Chứng minh rằng T là một cây khung nhỏ nhất của G với các trọng số cạnh cho bởi w’ 23-1-11

Cho một đồ thị G và một cây khung nhỏ nhất T, giả sử rằng chúng ta giảm trọng số của một trong các cạnh không thuộc T Cho một thuật toán để tìm ra cây khung nhỏ nhất trong đồ thị bị thay đổi

23.2 Thuật toán Kruskal và Prim

Hai thuật toán cây khung nhỏ nhất được mô tả trong phần này là sự mở rộng của thuật toán tổng quát Mỗi thuật toán sử dụng những quy tắc riêng để xác định một cạnh an toàn

Trang 8

ở dòng thứ 3 của thủ tục GENERIC-MST Trong thuật toán Kruskal thì A tạo nên một rừng Một cạnh an toàn được bổ sung vào tập A thì cạnh đó luôn là cạnh có trọng số nhỏ nhất trong đồ thị nối hai thành phần phân biệt Trong thuật toán Prim, A tạo nên một cây duy nhất trong suốt quá trình thực hiện thuật toán Cạnh an toàn được bổ sung vào A luôn là cạnh có trọng số nhỏ nhất nối cây với một đỉnh không thuộc cây

Trang 9

Hình 23.4: Thực hiện thuật toán Kruskal đối với đồ thị được mô tả ở hình 23.1 Những cạnh được tô đậm thuộc rừng A đang được trồng Thuật toán Kruskal quan tâm đến những cạnh được sắp xếp theo thứ tự của trọng số Một mũi tên chỉ đến một cạnh là một bước của thuật toán Nếu một cạnh nối hai cây phân biệt trong rừng thì cạnh đó được bổ sung vào rừng, sau đó hợp hai cây đó thành một cây.

Thuật toán Kruskal

Thuật toán Kruskal dựa trên thuật toán cây khung nhỏ nhất tổng quát được đưa ra ở phần 23.1 Thuật toán này tìm một cạnh an toàn để phát triển rừng bằng cách tìm trong tất

cả các cạnh (u,v) cạnh nào có trọng số nhỏ nhất nối hai cây bất kỳ trong rừng Ví dụ C1

và C2 là hai cây được nối với nhau bởi cạnh (u,v) Bởi vì cạnh (u,v) phải là cạnh nhỏ nhất nối C1 với cây nào đó, thì theo hệ quả 23.2 thì (u,v) là một cạnh an toàn cho C1 Thuật toán Kruskal là một thuật toán tham lam với vì ở mỗi bước của thuật toán bổ sung vào rừng một cạnh có trọng số nhỏ nhất

Cách thực hiện thuật toán Kruskal được xem như là thuật toán dùng để tính toán các thành phần liên thông ở phần 21.1 Thuật toán này sử dụng cấu trúc dữ liệu rời nhau để

Trang 10

duy trì các tập phần tử rời nhau Mỗi tập bao gồm các đỉnh của một cây của rừng hiện thời Hàm FIND-SET(u) trả về một phần tử đại diện từ tập chứa đỉnh u Vì vậy, ta xác định hai đỉnh bất kỳ u và v thuộc về cùng một cây hay không bằng cách kiểm tra hai hàm FIND-SET(u) va FIND-SET(v) có bằng nhau hay không Việc hợp cây được hoàn thành bởi thủ tục UNION

MST-KRUSKAL(G, w)

1 A 

2 for each vertex vV[G]

3 do MAKE-SET(v)

4 sort the edges of E into nondecreasing order by weight w

5 for each edge(u,v)  E, taken in nondecreasing order by weight

6 do if FIND-SET(u) ≠ FIND-SET(v)

7 then A  A {(u,v)}

8 UNION(u,v)

9 return A

Thuật toán Kruskal thực hiện như mô tả ở hình 23.4 Ban đầu từ dòng 1- 3 tập A là tập rỗng và khởi tạo |V| cây và mỗi cây chứa một đỉnh Các cạnh trong tập E được sắp xếp theo thứ tự không giảm của trọng số ở dòng 4 Vòng lặp For từ dòng 5-8 làm nhiệm

vụ kiểm tra đối với mỗi cạnh (u,v) cho dù các đỉnh cuối u và v có thuộc cùng một cây hay không Nếu u và v thuộc cùng một cây thì cạnh (u,v) không thể bổ sung vào rừng , vì cạnh (u,v) sẽ tạo thành chu trình do đó ta loại bỏ cạnh (u,v) Thay vào đó, hai đỉnh thuộc

về hai cây khác nhau trong trường hợp này cạnh (u,v) được bổ sung vào tập A ở dòng 7

và hai cây đó được hợp thành một cây ở dòng 8

Thời gian thực hiện thuật toán Kruskal cho đồ thị G=(V,E) phụ thuộc vào việc thực hiện của cấu trúc dữ liệu của tập rời nhau Ta giả sử rằng việc thực hiện rừng tập tách rời (disjoin-set-forest) trong phần 21.3 với việc hợp theo thứ hạng (union-by-rank) và nén đường dẫn (path-compression) mang tính kinh nghiệm bởi vì nó gần như biết được cách thực hiện nhanh nhất Ban đầu tập A ở dòng 1 thời gian thực hiện mất 0(1) và thời gian

để thực hiện sắp xếp các cạnh ở dòng 4 là 0(E lg E) (Ta sẽ tính toán chi phí |V| lần thao tác MAKE-SET trong vòng lặp For ở dòng 2 và 3 cùng một lúc) Vòng lặp For ở dòng

5-8 thực hiện 0(E) thao tác FIND-SET và UNION trên rừng tập tách rời Đối với |V| thao tác MAKE-SET thì tổng thời gian thực hiện là 0((V+E)α(V)) trong đó α là hàm phát triển chậm được định nghĩa ở phần 21.4 Bởi vì đồ thị G đã cho là đồ thị liên thông do đó ta có|E| ≥|V| -1 do đó thao tác thực hiện trên các tập rời nhau sẽ mất 0(Eα(V)) Mặt khác, bởi vì α(|V|)=0(lgV)=0(lgE) do đó tổng thời gian thực hiện thuật toán Kruskal là 0(E lg

Ngày đăng: 11/04/2015, 22:46

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w