1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài toán cây khung nhỏ nhất và các ứng dụng

115 1,3K 4

Đ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 115
Dung lượng 2,73 MB

Nội dung

Nói cách khác, nó tìm một tập hợp các cạnh tạo thành một cây chứa tất cả các đỉnh của đồ thị và có tổng trọng số các cạnh là nhỏ nhất.. Sử dụng hai thuộc tính trên có thể chứng mình các

Trang 1

MỤC LỤC

DANH MỤC BẢNG BIỂU iii

Chương 1 1

GIỚI THIỆU TỔNG QUAN 1

1.1 Lịch sử của bài toán cây khung nhỏ nhất 1

1.2 Các ký hiệu toán học 2

1.3 Lý thuyết đồ thị 3

1.4 Cây khung nhỏ nhất 6

1.4.1 Một số tính chất 6

1.4.2 Rừng trải rộng tối thiểu và những giả định đồ thị 8

1.4.3 Thời gian tính 9

1.5 Các ứng dụng của bài toán MST 10

1.5.1 Truyền hình cáp 11

1.5.2 Thiết kế mạch điện tử 11

1.5.4 Clustering biểu hiện dữ liệu gen (Thuật phân nhóm dữ liệu biểu hiện gen) 11

1.5.5 Xấp xỉ dựa trên MST 12

1.6 Kỹ nghệ thuật toán (Algorithm Engineering) 13

1.6.1 Giới thiệu 13

1.6.2 Nền tảng của kỹ nghệ thuật toán 22

1.7 Mục tiêu và kết quả của Luận văn 26

Chương 2 28

CẤU TRÚC DỮ LIỆU VÀ CÁC THUẬT TOÁN GIẢI BÀI TOÁN MST 28

2.1 Khối xây dựng cơ bản 28

2.1.1 Hàng đợi ưu tiên 28

2.1.2 Kết nối đồ thị và sơ đồ tổng quát của các thuật toán MST 29

2.1.3 Thuật toán Kruskal 34

2.1.4 Thuật toán Boruvka 35

2.1.5 Thuật toán Dijkstra-Jarn'ık-Prim (DJP) 37

2.2 Khối xây dựng nâng cao 40

2.2.1 Thuật toán "Trường hợp đồ thị dày" 40

2.2.2 Cây quyết định MST 46

2.2.3 Đống mềm 55

Chương 3 73

THUẬT TOÁN MST TỐI ƯU 73

Trang 2

3.1 Biểu diễn đồ thị 73

3.2 Bổ đề chính và thủ tục 75

3.2.1 Bổ đề chính 75

3.2.2 Phương pháp phân vùng 76

3.2.3 Thời gian tính phân vùng và thực hiện 78

3.3 Thuật toán MST tối ưu 81

3.3.1 Thuật toán 81

3.3.2 Thời gian thực hiện 85

3.3.3 Phân tích cây quyết định 87

3.3.4 Kết luận thời gian tính 89

3.4 Thực hiện 90

3.4.1 Thực hiện chi tiết 90

3.4.2 Thông tin thực tiễn 91

Chương 4 92

THỰC NGHIỆM 92

4.1 Mục đích thực nghiệm và các thuật toán được lựa chọn để thực nghiệm 92

4.1.1 Mục đích 92

4.1.2 Các thuật toán 92

4.2 Môi trường và dữ liệu thực nghiệm 93

4.2.1 Bộ dữ liệu thực nghiệm 93

4.2.2 Môi trường thực nghiệm 95

4.3 Mô tả cài đặt các thuật toán 95

4.4 Kết quả thực nghiệm 96

4.5.Phân tích kết quả thực nghiệm MST 98

Tài liệu tham khảo 99

Phụ lục 100

Trang 3

DANH MỤC BẢNG BIỂU

Bảng 1.1: Thời gian chạy trường hợp tồi nhất các thuật toán MST, sắp xếp theo năm 10

Bảng 2.1 Thời gian thực hiện của đống nhị phân, đống Fibonaccis, và Đống mềm 29

Bảng 2.2: Giá trị của 54

Bảng 4.1: Các thuật toán được lựa chọn thực nghiệm 92

Bảng 4.2 Giá trị của với mật độ đồ thị 93

Bảng 4.3 : Giá trị của với mật độ đồ thị 93

Bảng 4.4: Giá trị với mật độ đồ thị 94

Bảng 4.5 Giá trị với mật độ đồ thị 94

Bảng 4.6 Giá trị của với mật độ đồ thị 94

Bảng 4.7 Giá trị của với mật độ đồ thị 94

Bảng 4.8 Giá trị của với mật độ đồ thị 94

Bảng C.1: Thể hiện giá trị của , và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh, cạnh với mật độ đồ thị 104

Bảng C.2: Thể hiện giá trị của , và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh, cạnh với mật độ đồ thị 105

Bảng C.3: Thể hiện giá trị của và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh, cạnh với mật độ đồ thị 106

Bảng C.4: Thể hiện giá trị của và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh cạnh với mật độ đồ thị 107

Bảng C.5: Thể hiện giá trị của và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh cạnh với mật độ đồ thị 108

Bảng C.6: Thể hiện giá trị của và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh cạnh với mật độ đồ thị 109

Bảng C.7: Thể hiện giá trị của và thời gian chạy t(ms) của các thuật toán tìm MST của đơn đồ thị có đỉnh, cạnh với mật độ đồ thị 110

Trang 4

Hình 1.1: Đơn đồ thị liên thông với và 4

Hình 1.2: Các thuộc tính chu kỳ và các thuộc tính cắt cắt 7

Hình 1.3 Kỹ nghệ thuật toán 21

Hình 2.1: Một đồ thị với đỉnh xác định bởi ((1, 2), (1, 3), (2, 3)) và cây quyết định tối ưu nối cứng của nó 49

Hình 2.2: Cấu trúc dữ liệu Đống mềm với ba hàng đợi mềm 58

Hình B.1: Ví dụ về chọn lọc, bắt đầu từ một sự lặp lại liên kết lại 100

Hình B.2.1: Đồ thị đầu vào Hình B.2.2: Sau khi phân vùng 102

Hình B.2.3: Sau cây quyết định Hình B.2.4: Đồ thị kết nối Ga 103

Hình B.2.5: Sau DenseCase Hình B.2.6: Cạnh ứng viên Gb 103

Hình B.2.7: cạnh MST T'được tìm thấy bởi Boruvka2 104

Hình C.1: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị (trục Ox biểu diễn , Oy biểu diễn 𝑡 𝑠 ) 105

Hình C.2: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị (trục Ox biểu diễn m, Oy biểu diễn t(s)) 106

Hình C.3: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị (trục Ox biểu diễn , Oy biểu diễn 𝑡 𝑠 ) 107

Hình C.4: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu 108

nhiên với mật độ đồ thị (trục Ox biểu diễn , Oy biểu diễn 𝑡 𝑠 ) 108

Hình C.5: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị 𝑥 (trục Ox biểu diễn ,Oy biểu diễn 𝑡 𝑠 ) 109

Hình C.6: Đồ thị thể hiện thời gian chạy t của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị 𝑥 (trục Ox biểu diễn ,Oy biểu diễn 𝑡) 110

Hình C.7: Đồ thị thể hiện thời gian chạy t(ms) của các thuật toán trên đồ thị ngẫu nhiên với mật độ đồ thị 𝑥 (trục Ox biểu diễn , Oy biểu diễn 𝑡) 111

Trang 5

Chương 1 GIỚI THIỆU TỔNG QUAN

1.1 Lịch sử của bài toán cây khung nhỏ nhất

Cho G = (V, E) (V là tập đỉnh, E là tập cạnh) là đồ thị vô hướng liên thông có

trọng số trên cạnh 𝑤 Giả sử T là một cây khung của G, ta gọi trọng số của

cây T là tổng trọng số các cạnh trong T Bài toán đặt ra là trong số các cây khung của G, hãy tìm cây khung có trọng số nhỏ nhất Cây khung như vậy được gọi là cây

khung nhỏ nhất của đồ thị (minimum spanning tree) và bài toán đặt ra được gọi là bài toán cây khung nhỏ nhất

Năm 1926, nhà toán học người Séc Otakar Boruvka mô tả một thuật toán giải

"một số bài toán cực tiểu hoá" [4] Ông đã đề xuất các thuật toán để tối ưu hoá mạng lưới điện Vào thời Boruvka chưa có các khái niệm về đồ thị và cây khung tối thiểu Thuật toán của ông là thuật toán giải bài toán cây khung nhỏ nhất được biết đến sớm nhất Ngày nay thuật toán này được gọi là thuật toán của Boruvka Trong luận văn, cây khung nhỏ nhất được gọi tắt là "MST"

Năm 1930, một thuật toán MST khác được phát hiện bởi nhà toán học Séc Jarn'ık [9] Thuật toán này được đề xuất độc lập bởi nhà toán học và khoa học máy tính người Mỹ Prim vào năm 1957, và sau đó tái khám phá bởi các nhà khoa học máy tính Hà Lan Dijkstra trong năm 1959 Do đó, thuật toán đôi khi được gọi là thuật toán của Prim, thuật toán của Jarn'ık, thuật toán Prim-Jarn'ık hoặc thuật toán DJP Trong luận văn này, chúng tôi gọi thuật toán này là thuật toán DJP

Thuật toán Kruskal là một thuật toán trong lý thuyết đồ thị để tìm cây bao trùm tối thiểu của một đồ thị liên thông có trọng số Nói cách khác, nó tìm một tập hợp các cạnh tạo thành một cây chứa tất cả các đỉnh của đồ thị và có tổng trọng số các cạnh là nhỏ nhất Thuật toán Kruskal là một ví dụ của thuật toán tham lam Thuật toán này xuất bản lần đầu tiên năm 1956, bởi Joseph Kruskal

Nhiều thuật toán MST hiện đại sử dụng các ý tưởng từ thuật toán Boruvka và DJP Cụ thể là các thuật toán MST tối ưu được nghiên cứu trong luận văn này sử

Trang 6

dụng rất nhiều ý tưởng từ cả hai thuật toán Kể từ khi phát minh ra các thuật toán, các bài toán MST đã được nghiên cứu rất nhiều, nhưng chưa ai tìm ra được cận dưới chính xác cho độ phức tạp thời gian của bài toán MST Thuật toán MST tối ưu nghiên cứu trong luận văn này được thiết kế bởi Pettie và Ramachandran [13] vào năm 2002 Các tác giả đã chứng minh rằng các thuật toán chạy trong thời gian tối ưu, nhưng không thể đưa ra một cận dưới chính xác thấp hơn Thuật toán này sẽ được trình bày

Trong luận văn, ta sẽ sử dụng ký hiệu log = , đó là logarithm với cơ số 2

Với số nguyên , ký hiệu được định nghĩa quy nạp như sau:

và =

Ví dụ: logloglog

Ký hiệu được định nghĩa là { | , nghĩa là, số lần các hàm logarithm phải được áp dụng cho đến khi thu được kết quả là Hàm số này tăng rất chậm, và là nhỏ hơn 6 cho tất cả các giá trị "thực" của

Giai thừa của một số nguyên dương n, kí hiệu là n!, được định nghĩa là

Hàm n! có thể định nghĩa đệ qui bởi: và !=( −1) Dễ dàng thấy là Đối với số nguyên không âm và hàm Ackermann 𝐴( , ) được định nghĩa đệ quy như sau:

Trang 7

𝐴 {

𝐴 𝐴( 𝐴 )

Một tính chất quan trọng của 𝐴 là giá trị của nó tăng rất nhanh Gọi

𝐴′( ) = 𝐴( , ) Khi đó 𝐴′ tăng rất nhanh, ngược lại hàm nghịch đảo của nó 𝐴 tăng

rất chậm Hàm nghịch đảo của hàm Ackermann được ký hiệu là 𝛼 Hàm 𝛼( ) là nhỏ

hơn 5 cho tất cả giá trị "thực" của Hàm nghịch đảo Ackermann hai tham số được định nghĩa bởi 𝛼( , ) = min{ ≥1| 𝐴( ,[ / ]) ≥ log } Chú ý là hàm 𝛼 tăng rất chậm Đối với số nguyên ≥ 0 và ≥1, hàm 𝛽( , ) được định nghĩa là 𝛽 { | , nghĩa là 𝛽( , ) là số lần các hàm logarithm được áp dụng đối với để thu được kết quả là ≤ /

1.3 Lý thuyết đồ thị

Đồ thị vô hướng G là một kiểu dữ liệu trừu tượng được xác định bởi

, trong đó là một tập đỉnh và là một tập cạnh, đó là các cặp đỉnh không có

thứ tự Ta sẽ ký hiệu =| | và =| |, và tập đỉnh {𝑣 𝑣 𝑣 , tập cạnh { Lớp các đồ thị với đỉnh và cạnh được ký hiệu là

Để chỉ ra tập đỉnh của đồ thị ta dùng kí hiệu bởi , và tập cạnh của nó được kí hiệu bởi Một cạnh nối hai đỉnh 𝑣 và 𝑣 , và được ký hiệu 𝑣 𝑣 Theo định nghĩa của một đồ thị vô hướng, một cạnh là một cặp không có thứ tự gồm hai đỉnh, vì vậy 𝑣 𝑣 𝑣 𝑣 Mỗi cạnh của đồ thị sẽ được gán một trọng số dương 𝑤 có thể hiểu đó là chi phí của "sử dụng" cạnh Nếu 𝑤 𝑤 với thì được coi là nhẹ hơn , nặng hơn Để đơn giản, tất cả các ví dụ đồ thị trong luận văn này sẽ có trọng số cạnh tương ứng với khoảng cách Euclide giữa các điểm cuối Điều này là một giả định phổ biến trong các ví dụ thực tế, chẳng hạn như

mạng lưới đường bộ và mạng lưới điện hoặc dây dữ liệu Bậc của một đỉnh v, ký hiệu

bởi 𝑣 là số cạnh kề với nó (nhận nó là đầu mút) Một đường đi trong đồ thị là một dãy các đỉnh và cạnh xen kẽ bắt đầu từ một đỉnh và kết thúc tại một đỉnh Như

Trang 8

vậy, mỗi cạnh trên đường đi sẽ kết nối giữa một đỉnh với một đỉnh đi sau nó Như vậy

đường đi có thể mô tả bởi dãy: 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣

Ta gọi chu trình là một đường đi không chứa cạnh lặp lại khởi đầu và kết thúc

tại cùng một đỉnh, nghĩa là 𝑣 𝑣 Một đường đi được gọi là đường đi đơn

nếu các đỉnh trên nó là phân biệt Tương tự như vậy, một chu trình đơn là một chu

trình mà các đỉnh trên nó là phân biệt, ngoại trừ đỉnh bắt đầu và kết thúc

Hình 1.1: Đơn đồ thị liên thông với 𝒏 và 𝒎

Ví dụ: Hình 1.1 cho một ví dụ về đồ thị G = (V, E) với {𝑣 , , 𝑣 } và { 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 Dãy (các cạnh trên đường đi thể hiện

bởi đoạn tô đậm) 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 cho ta ví dụ một đường đi

đơn Dãy (các cạnh trên đường đi thể hiện bởi đoạn gạch

chấm) 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 𝑣 cho ta ví dụ về một chu

trình đơn

Một đồ thị được gọi liên thông nếu luôn tìm được đường đi giữa hai đỉnh bất

kỳ Ta gọi khuyên là một cạnh nối một đỉnh với chính nó, tức là cạnh có dạng

𝑣 𝑣 Cạnh như vậy sẽ được tính hai lần trong 𝑣 Hai cạnh khác nhau,

và là cạnh song song (hay cạnh lặp) nếu chúng cùng nối một cặp đỉnh Một đồ thị

có chứa cạnh lặp được gọi là đa đồ thị Một đồ thị có chứa cạnh lặp và khuyên được

gọi là giả đồ thị Ta gọi đơn đồ thị là đồ thị vô hướng không có khuyên và không có

Trang 9

các cạnh lặp Từ định nghĩa, tập cạnh của đơn đồ thị là một tập các bộ không có thứ

tự gồm hai đỉnh Bậc lớn nhất của một đỉnh trong một đơn đồ thị là , và bậc của một đỉnh là số đỉnh lân cận với nó Đồ thị trong hình 1.1 là một đơn đồ thị liên thông Nếu đồ thị là không liên thông, đồ thị con liên thông cực đại của nó được gọi

là thành phần được liên thông

Có thể chứng minh được rằng số lượng cạnh trong một đơn đồ thị liên thông

luôn lớn hơn hoặc bằng n-1 Vì vậy, cây là đồ thị liên thông có ít cạnh nhất Ta gọi

rừng là đồ thị mà mỗi thành phần liên thông là một cây

Một trường hợp đặc biệt của một đơn đồ thị liên thông là đồ thị đầy đủ Đồ thị đầy đủ là đồ thị có tất cả các cạnh có thể Tổng số cạnh của đồ thị đầy đủ là = 2 , nghĩa là số cạnh của đồ thị đầy đủ là 2 Đồ thị đầy đủ với

đỉnh được ký hiệu K n

Trong suốt luận văn này, chúng ta sẽ định nghĩa mật độ của một đồ thị là tỷ lệ

giữa số cạnh và số đỉnh, đó là bằng m/n Số cạnh m trong một đơn đồ thị liên thông n

đỉnh thoả mãn bất đẳng thức: Như vậy m nằm trong

khoảng và Một đồ thị được gọi là đồ thị thưa nếu là nhỏ Tương

tự, đồ thị dày là đồ thị có là lớn Quan niệm “nhỏ”/”lớn” sẽ được nêu rõ trong phạm vi ứng dụng cụ thể Một trường hợp đồ thị thưa đặc biệt là đồ thị phẳng Đồ thị phẳng là đồ thị có thể vẽ trong mặt phẳng sao cho hai cạnh bất kỳ là không giao nhau, ngoại trừ tại đỉnh Ta có

Định lý 1.3: Đồ thị phẳng đơn liên thông với đỉnh có ≤ 3 −6 cạnh

Do đó, đối với một đồ thị phẳng, mật độ được giới hạn bởi một hằng số, ta có = ( ) Do ta có cận dưới cho số lượng cạnh của đơn đồ thị liên thông là , nên kích thước đầu vào của bất kỳ đơn đồ thị liên thông với cạnh là Do đó, thời gian cần thiết để xây dựng một đơn đồ thị liên thông với cạnh là

Trang 10

1.4 Cây khung nhỏ nhất

Định nghĩa: Cho G là một đồ thị liên thông Một cây khung của G là một cây

chứa tất cả các đỉnh với tập cạnh là tập con của tập cạnh của G Nói cách khác cây khung là một cây bao trùm tất cả các đỉnh trong G

Định nghĩa: Cho T là một cây khung của một đồ thị liên thông có trọng số

Trọng lượng của T được xác định bằng tổng trọng số của các cạnh trong T:

Định nghĩa: Cho G là một đồ thị liên thông có trọng số Cây khung nhỏ nhất

(MST) của G là cây khung của G với trọng số là nhỏ nhất

Rõ ràng là từ định nghĩa, MST là một lời giải cho các bài toán trong đó đòi hỏi phải so sánh các trọng số cạnh Nếu đồ thị có trọng số các cạnh là bằng nhau thì mọi cây khung của nó đều là MST Ví dụ này cho thấy đồ thị có thể có nhiều cây khung nhỏ nhất Tuy nhiên, trong phần tiếp theo ta sẽ thấy là nếu một đồ thị có trọng số các cạnh là phân biệt (tức là không có hai cạnh nào có cùng trọng số), thì cây khung nhỏ nhất của nó là duy nhất

1.4.1 Một số tính chất

Thuộc tính chu trình

Định lý 1.4.1: Đối với mỗi chu trình đơn của đồ thị liên thông có trọng số với trọng lượng cạnh phân biệt, cạnh nặng nhất trong chu trình không thuộc bất cứ một MST nào của

Chứng minh: Xem Hình 1.2a Giả sử ngược lại, tức là cạnh nặng nhất e

thuộc

một MST Xóa từ một MST sẽ chia thành hai cây con tách rời với hai điểm cuối của trong cây con khác nhau Có tồn tại một số cạnh trong chu trình với các đầu cuối trong hai cây con khác nhau Bởi vì 𝑤 𝑤 , kết nối hai cây con lại

Trang 11

bằng sẽ sinh ra một cây khung có trọng lượng nhỏ hơn Do đó không thuộc về một MST

(a) Các thuộc tính chu kỳ Các cạnh đậm là

MST Các đường đứt minh họa của tách cây

(b) Các thuộc tính cắt Chỉ có các cạnh trong cắt được hiển thị

Hình 1.2: Các thuộc tính chu kỳ và các thuộc tính cắt cắt

Thuộc tính cắt

Định nghĩa: Cho là tập đỉnh của một đồ thị ,| | Cho

và là hai tập con khác rỗng tạo thành phân hoạch của tập đỉnh

là và Giả sử

là tập các cạnh với có một đầu mút thuộc còn đầu mút kia thuộc Khi đó

𝑡 tạo thành một lát cắt trong đồ thị

Định lý 1.4.2: Giả sử C là một lát cắt trong một đồ thị liên thông có trọng

số với trọng lượng cạnh phân biệt, cạnh nhẹ nhất trong phải thuộc một MST của

Chứng minh: Xem Hình 1.2b Giả sử 𝑢 và 𝑣 biểu thị đỉnh điểm cuối của cạnh

nhẹ Nếu là cạnh duy nhất trong trên đường đơn bất kỳ giữa 𝑢 và 𝑣, do đó

chứng minh là hiển nhiên bởi vì tất cả các đỉnh trong phải được kết nối trong một MST Ngược lại, giả sử ngược lại, tức là nhẹ nhất cạnh không thuộc về một MST

Nó là rõ ràng có một số cạnh, , trong trên đường giữa 𝑢 và 𝑣 trong MST giả định,

Trang 12

ngược lại thì hai đỉnh sẽ không được kết nối trong MST Do 𝑤 𝑤 , thay thế

bởi sẽ tạo ra một cây khung có trọng lượng nhỏ hơn Do đó thuộc về một MST

Sử dụng hai thuộc tính trên có thể chứng mình các kết quả sau:

Định lý 1.4.3: Cho là một đồ thị liên thông có trọng số với trọng số cạnh khác biệt, cho là một MST của , và cho là một cạnh bất kỳ trong Nếu , vậy thì là cạnh nhẹ ở một lát cắt trong Nếu , vậy thì là cạnh nặng nhất trong một chu trình của

1.4.2 Rừng trải rộng tối thiểu và những giả định đồ thị

Chúng tôi đã xác định các bài toán MST cho các đồ thị liên thông Thành phần liên thông có ý nghĩa, vì theo định nghĩa của một cây, không tồn tại cây khung cho các đồ thị không liên thông

Một rừng khung được xác định bởi sự kết hợp của cây khung cho mỗi thành phần liên thông trong một đồ thị Tương tự, rừng khung tối thiểu (MSF) được xác định như rừng khung với trọng số tối thiểu Do đó, bài toán MSF là một sự tổng quát của bài toán MST, và có thể được giải quyết bằng cách giải quyết các bài toán MST cho từng thành phần liên thông trong đồ thị Dễ dàng xác định các thành phần liên thông của đồ thị trong thời gian tuyến tính nhờ sử dụng tìm kiếm theo chiều sâu (DFS), và sau đó giải quyết các bài toán MST cho mỗi thành phần được liên thông

Bài toán MST như là một chuyển hóa của bài toán MSF, chúng tôi sẽ đề cập đến hai thuật ngữ thay thế cho nhau khi sự khác biệt là không đáng kể

Trang 13

Đối với đồ thị đầu vào bất kỳ, nếu nó không phải là đơn đồ thị, chúng ta có thể thực hiện một bước tính toán trước để loại bỏ các cạnh lặp và các khuyên Bước tính toán trước đó có thể được thực hiện trong thời gian tuyến tính bằng việc thực hiện 𝑡𝑟 𝑡 được xây dựng dựa trên DFS

Trong luận văn này, chúng tôi giả định là tất cả các đơn đồ thị và liên thông

1.4.3 Thời gian tính

Trong phần này, chúng tôi sẽ trình bày thời gian chạy của các thuật toán MST trong luận văn này, cũng như một số thuật toán quan trọng khác

Các thuật toán MST nhận đầu vào đồ thị có đỉnh và cạnh Một hàm mô

tả chính xác độ phức tạp của bài toán MST cho đồ thị nói chung là chưa được xác định cho đến thời điểm hiện tại Luận văn sẽ cho thấy tồn tại một thuật toán chạy theo thứ tự thời gian tối ưu của sự so sánh tổng số các trọng lượng cạnh, mặc dù các hàm cho "tối ưu" là không rõ

Dễ dàng chứng minh rằng đối với mọi , >2, luôn có thể xây dựng một đơn

đồ thị mà mỗi cạnh thuộc ít nhất một chu trình đơn Do đó, để giải quyết các bài toán MST, mỗi trọng số cạnh phải được xử lý ít nhất một lần, suy ra cận dưới cho độ phức tạp của bài toán MST là Ω( ) Cận dưới tốt nhất hiện nay là ( ·𝛼 ( , )) của Chazelle[5] Ở đây, 𝛼( , ) là nghịch đảo của hàm Ackermann tăng rất chậm, một cách phát biểu nôm na là độ phức tạp của bài toán MST "gần như tuyến tính" với kích thước đồ thị Năm 1995, Karger et al [10] trình bày một thuật toán MST ngẫu nhiên với thời gian kỳ vọng là ( ) Thuật toán này hoạt động theo giả định rằng chúng ta

có quyền truy cập vào vô số bit thực sự ngẫu nhiên Tuy nhiên, luận văn này sẽ chỉ tập trung về trường hợp xấu nhất thời gian chạy cho các thuật toán tất định giải bài toán MST

Hàm biểu thị tối thiểu (tối ưu) so sánh số trọng số cạnh cần thiết để tìm MST của đồ thị bất kỳ với n đỉnh và m cạnh Hàm biểu thị tối thiểu (tối ưu) số so sánh trọng số cạnh cần thiết để tìm MST của đồ thị G riêng biệt Bảng 1.1.1

Trang 14

cho thấy thời gian chạy các thuật toán xác định MST khác nhau (và cây quyết định tối ưu) với mật độ đồ thị khác nhau

Lưu ý, các giới hạn thưa - dày là duy nhất cho mỗi thuật toán Các thuật toán được đề cập trong Luận văn này được viết với chữ đậm Thuật toán được gọi là "tối ưu" là thuật toán MST tối ưu của Pettie và Ramachandran [13], mà chúng tôi sẽ phân tích trong luận văn này

Bảng 1.1.1 cho thấy rằng thuật toán MST tồn tại với thời gian hoạt động tuyến tính cho mật độ nhất định Nhưng đối với các lớp trung gian của đồ thị "thưa", chưa

có thuật toán MST với thời gian chạy tuyến tính Tuy nhiên, như đã nói ở trên, luận văn này sẽ trình bày một thuật toán mà chạy theo thứ tự "tối ưu" thời gian cho tất cả các mật độ

Cây bao trùm tối thiểu là hữu ích trong việc xây dựng lưới mạng, bằng cách

mô tả cách để kết nối một tập hợp các địa điểm bằng cách sử dụng tổng số chí phí của dây nhỏ nhất Phần lớn các công việc trên cây bao trùm tối thiểu đã được tiến hành nghiên cứu và ứng dụng bởi các công ty truyền thông

Trang 15

1.5.1 Truyền hình cáp

Một ví dụ là một công ty truyền hình cáp đặt cáp đến một khu phố mới Nếu

nó là hạn chế để chôn cáp chỉ theo những con đường nhất định, do đó sẽ có một đồ thị đại diện những điểm đó được nối với nhau bằng những con đường Một trong số những con đường có thể tốn kém hơn, bởi vì nó là dài hơn, hoặc yêu cầu các cáp được chôn sâu hơn Một cây bao trùm cho đồ thị đó sẽ là một tập hợp con của những con đường mà không có chu kỳ nhưng vẫn kết nối đến từng nhà Có thể có một vài cây khung có thể tồn tại Một cây bao trùm tối thiểu sẽ phải ràng buộc với tổng chi phí thấp nhất

1.5.2 Thiết kế mạch điện tử

Trong thiết kế mạch điện tử, nó thường là cần thiết để nối dây một số chân lại với nhau để làm cho nó có điện tương đương Một cây bao trùm tối thiểu cần chi phí

ít nhất của dây để kết nối một tập hợp điểm

1.5.3 Quần đảo kết nối

Giả sử chúng ta có một nhóm các hòn đảo mà chúng ta muốn liên kết với cây cầu để nó có thể đi du lịch từ một hòn đảo bất kỳ khác trong nhóm Giả sử thêm rằng chính phủ muốn chi tiêu số tiền tối thiểu về dự án này Các kỹ sư có thể tính toán chi phí cho một liên kết cầu mỗi cặp có thể có của hòn đảo Tập hợp các cây cầu đó sẽ giúp ta đi du lịch từ hòn đảo bất kỳ đến tất cả các đảo khác với chi phí tối thiểu cho chính phủ là cây bao trùm tối thiểu

1.5.4 Clustering biểu hiện dữ liệu gen (Thuật phân nhóm dữ liệu biểu hiện gen)

Cây bao trùm tối thiểu cũng cung cấp một phương pháp hợp lý để nhóm các điểm trong không gian thành các nhóm tự nhiên Ví dụ, Ying Xu và cộng sự [19] mô

tả một kết cấu mới biểu diễn cho một tập hợp các dữ liệu biểu hiện gene đa chiều như một cây bao trùm tối thiểu Một thuộc tính quan trọng của biểu diễn này là mỗi cụm

dữ liệu biểu hiện gen tương ứng với một cây con của MST, trong đó một cách chuyển đổi chặt chẽ một bài toán phân nhóm đa chiều với một bài toán phân vùng cây Họ đã

Trang 16

chứng minh rằng, mặc dù mối quan hệ giữa các dữ liệu là rất đơn giản trong các biểu diễn MST, không có thông tin quan trọng bị mất cho các kết quả của phân nhóm Họ nhận thấy rằng có hai lợi thế quan trọng trong việc biểu diễn cho một tập hợp các dữ liệu đa chiều như một MST Một cấu trúc đơn giản của một cây thuận tiện cho việc thực hiện hiệu quả chính xác của thuật toán phân cụm Mặt khác là nó có thể vượt qua nhiều bài toán phải đối mặt bởi các thuật toán phân nhóm cổ điển từ một phân nhóm dựa trên MST không phụ thuộc vào hình dạng hình học chi tiết của một cụm Một công cụ mới được gọi là phần mềm EXCAVATOR, viết tắt của “EXpression data Clustering Analysis and VisualizATiOn Resource,” đã được phát triển dựa trên new framework Các kết quả phân nhóm trên các dữ liệu biểu hiện gen (1) từ nấm men Saccharomyces cerevisiae, (2) trong phản ứng nguyên bào sợi huyết thanh của loài người, và (3) của Arabidopsis trong phản ứng để tìm ra chitin là rất hứa hẹn

1.5.5 Xấp xỉ dựa trên MST

Trong các bài toán nhân viên bán hàng đi du lịch (TSP), chúng ta đưa ra một

đồ thị vô hướng hoàn chỉnh có hàm trọng lượng w kết hợp với mỗi cạnh, và chúng ta mong muốn tìm được một tour của với trọng lượng tối thiểu Bài toán này đã được chứng minh là NP-khó ngay cả khi hàm trọng lượng thõa mãn bất đẳng thức tam giác, , cho tất cả ba đỉnh 𝑥 𝑦 𝑧 𝑤 𝑥 𝑧 𝑤 𝑥 𝑦 𝑤 𝑦 𝑧 Các bất bình đẳng tam giác phát sinh trong nhiều tình huống thực tế Nó có thể được hiển thị mà các chiến lược tiếp theo cung cấp một thuật toán xấp xỉ với một tỷ

lệ của 2 ràng buộc cho các bài toán nhân viên bán hàng đi du lịch với bất đẳng thức tam giác Đầu tiên, hãy tìm một cây khung tối thiểu T đối với đồ thị cho trước Sau

đó tăng gấp đôi MST và xây dựng một tour Cuối cùng, thêm các đường tắt để không có đỉnh được truy cập nhiều hơn một lần, mà được thực hiện bởi một bộ cây định trước Kết quả là chiều dài các tour không quá hai lần là tối ưu Nó cũng có thể chỉ ra được rằng một cách tiếp cận dựa trên MST cũng cung cấp một xấp xỉ tốt cho các bài toán cây Steiner

Trang 17

1.6 Kỹ nghệ thuật toán (Algorithm Engineering)

1.6.1 Giới thiệu

Trong thời đại hiện nay, chúng ta có thể thấy sự tác động của việc áp dụng thuật toán trong toàn bộ các phần mềm đã và đang được sử dụng Các thuật toán ngày càng trở nên chiếm vai trò quan trọng trong hệ thống ngành kinh tế, công nghệ, khoa học, và trong cuộc sống hàng ngày

Chúng ta có thể kể ra một số ngành nghề đặc biệt liên quan chặt chẽ đến việc

áp dụng các thuật toán như công nghệ sinh học, tìm kiếm thông tin, mạng lưới thông tin liên lạc, mật mã, hệ thống thông tin địa lý, lấy thông tin từ hình ảnh (chỉnh sửa, khôi phục), vận tải đa phương tiện

Algorithmics – hệ thống phát triển tính hiệu quả của thuật toán trở thành công nghệ chủ chốt trong quá trình phát triển các ứng dụng trên máy tính Tuy nhiên, trong những năm qua xuất hiện khoảng cách ngày càng lớn giữa lý thuyết về thuật toán thuần túy và nhu cầu thực tế Hệ quả của vấn đề này dẫn đến việc chỉ một số ít các thuật toán là thực sự được áp dụng trong thực tế Điều này thật sự rất đáng tiếc, để hiểu được vấn đề này, chúng ta cần tìm hiểu quá trình nghiên cứu thuật toán được diễn ra như thế nào theo cách thông thường

1.6.1.1 Thuật toán cổ điển

Trọng tâm của lý thuyết về thuật toán là các vấn đề đơn giản và có tính trừu tượng Đối với một vài vấn đề thuật toán được thiết kế và phân tích dựa trên các mô hình giả định sinh ra từ các máy trừu tượng (máy tính tự động sử dụng theo lý thuyết automata), từ đó đưa ra đánh giá thời gian chạy của các thuật toán trong trường hợp xấu nhất và xác định được chất lượng của thuật toán

Trong khoa học máy tính, thời gian thực hiện và chất lượng lời giải là thước

đo cho tính hiệu quả của thuật toán

Giải quyết các các vấn đề trừu tượng và mô hình máy trừu tượng (abstract machine) có những điểm đáng chú ý trên lý thuyết:

Trang 18

- Các thuật toán được thiết kế với các vấn đề như vậy có thể áp dụng trên nhiều ứng dụng cụ thể hóa trong các lĩnh vực khác nhau

- Hầu hết các mô hình máy cổ điển đều tương đương với thời gian sai khác không quá đa thức, tác động của thuật toán không được tính toán chi tiết

- Trường hợp xấu nhất của thuật toán xảy ra không giống như trong thiết kế

- Cho phép các máy tính độc lập thực hiện thuật toán để có thể so sánh về trường hợp xấu nhất mà không cần trang bị gì thêm

Từ quan điểm của lý thuyết thuật toán, việc áp dụng thuật toán là một phần của việc thiết kế và phát triển phần mềm Hiệu quả của thuật toán được đánh giá qua những người chuyên môn trong lĩnh vực của ứng dụng đó

Tuy nhiên, chúng ta nên lưu ý rằng đối với nhiều người tiên phong trong thuật toán những ngày đầu, như Knuth, Floyd và những người khác, tất cả các thuật toán

mà họ thiết kế được đánh giá dựa vào tiêu chuẩn thực hành Điều này làm thay đổi quan điểm về thiết kế thuật toán, và dẫn đến yêu cầu phải phát triển các cấu trúc dữ liệu tiên tiến để cài đặt các thuật toán

Qua việc triển khai và thử nghiệm giữa lý thuyết và thực hành, nhiều nhà khoa học đã nhận ra nhu cầu của việc thiết kế và phân tích từ thực tế ngày càng lớn Một nhóm các nhà nghiên cứu thuật toán bắt đầu tìm cách để khắc phục vấn đề này cách đây 15 năm

1.6.1.2 Nền tảng của Kỹ nghệ thuật toán

Qua cách tiếp cận thuật toán, chúng ta có thể thấy việc thực thi và thí nghiệm

có tầm quan trọng như việc phân tích và thiết kế Cách tiếp cận này đã cho chúng ta một khái niệm mới, đó là Kỹ nghệ thuật toán

Thomas Kuhn tiến hành phân tích cấu trúc sự biến chuyển của khoa học và sử dụng các mô hình khái niệm để miêu tả lại “sự kết hợp truyền thống của nghiên cứu khoa học” Theo Kuhn sự biến chuyển mô hình chỉ xảy ra khi mô hình cũ đang khủng

Trang 19

hoảng và không thể giải quyết được các vấn đề mới Vậy sự kiện đòi hỏi mô hình mới? Chúng ta sẽ liệt kê một vài ví dụ sau đây:

- Các mô hình máy tính Von – Neumann đã dần không còn thích hợp trong thực tế với các việc như xử lý song song, xử lý pipelining, dự đoán trước, phân cấp

bộ nhớ và bộ nhớ đệm, xử lý đa luồng, và mô hình tính toán phân tán và song song

- Trọng tâm của việc thiết kế thuật toán tập trung vào việc cải thiện đánh giá tiệm cận trong trường hợp xấu nhất và đảm bảo thuật toán đưa ra kết quả xấp xỉ như

đã dự đoán Điều này dẫn đến việc có nhiều thuật toán và cấu trúc dữ liệu được thiết

kế có nhiều ý tưởng mới nhưng không có tính thực tế Đôi khi, điều đó không chắc chắn rằng các thuật toán sẽ không được áp dụng Dù vậy, việc áp dụng vào thực tế sẽ rất khó khăn đến mức không ai muốn thử thực hiện việc này

Điểm bất lợi của việc nghiên cứu thời gian chạy tiệm cận là chúng có thể ẩn đi các hằng số rất lớn Tương tự, yêu cầu bộ nhớ có thể là rất lớn cho dù là bị chặn bởi

đa thức

- Như ví dụ cụ thể, chúng tôi có thể trích dẫn một số vấn đề trong thuật toán:

1 Rất nhiều (không phải tất cả) sơ đồ xấp xỉ thời gian đa thức (PTAS), chẳng hạn các sơ đồ của Aurora hoặc Mitchell cho bài toán người du lịch (TSP), có hệ số rất lớn

2 Robins và Zelikovsky trình bày một hệ thống thuật toán giải bài toán cây Steiner trong đồ thị với thời gian chạy là , trong đó là một tham số ảnh hưởng đến hiệu suất Đối với trường hợp lớn, thuật toán của họ đạt cận tỷ lệ tốt nhất hiện nay là 1.55 Để cải tiến tốt nhất mức xấp xỉ bảo đảm

ở 1.598 bởi Hougardy và Prömel, cần thiết phải chọn Ngoài ra, còn cần hơn 217 thiết bị đầu cuối

3 Câu hỏi liệu một đa giác đơn có thể được tam giác hóa trong thời gian tuyến tính hay không là một trong những vấn đề chính trong hình học tính toán nhiều năm qua Năm 1990, vấn đề này cuối cùng đã được Chazelle giải quyết,

Trang 20

ông đã đưa ra một thuật toán với thời gian tuyến tính khá phức tạp Theo những kiến thức chúng tôi biết thì thuật toán này chưa bao giờ được áp dụng

4 Việc xây dựng hình học, được biết đến như một kỹ thuật cắt, cung cấp một kỹ thuật phân vùng không gian cho bất kỳ kích thước hữu hạn nào mà trong đó có vô số ứng dụng trong hình học tính toán Tuy nhiên, thuật toán dựa trên cuttings dường như cho thấy một thách thức đối với việc thực hiện

Trong thực tế, yếu tố hằng số đóng vai trò khá lớn: trong các ứng dụng như phẫu thuật có sự trợ giúp của máy tính, phục hồi thông tin bằng công cụ tìm kiếm, hướng dẫn xe cộ, và nhiều ứng dụng khác, giải pháp này phải được tính trong thời gian gần như tức thời Trong các ứng dụng khác, năng suất của người sử dụng một công cụ phần mềm có liên quan chặt chẽ với hiệu suất của công cụ Ở đây bất kỳ sự cải thiện nào đối với yếu tố hằng số đều xứng đáng được đầu tư Vì vậy, việc cải tiến yếu tố hằng số thường tạo ra khác biệt cho dù công cụ có được áp dụng hay không

- Khái niệm về hiệu quả như khả năng giải quyết thời gian đa thức thường không phù hợp Thậm chí thời gian chạy nhỏ, nhưng siêu tuyến tính, mức độ đa thức

có thể quá chậm Các ứng dụng thực tế, chẳng hạn trong thiết kế VLSI, tin sinh học, hoặc xử lý dữ liệu không gian, yêu cầu phải xử lý các tập dữ liệu cực lớn Trong những trường hợp như vậy, chúng ta thường chỉ có thể áp dụng các thuật toán đòi hỏi thời gian và không gian chạy tuyến tính, thậm chí cần các thuật toán thời gian dưới tuyến tính Trong thực tế, nghiên cứu về các thuật toán dưới tuyến tính gần đây đã xuất hiện như là một lĩnh vực nghiên cứu mới Thuật toán dưới tuyến tính hoặc chỉ xem xét một mẫu nhỏ ngẫu nhiên của các dữ liệu đầu vào hoặc quá trình khi nó đến,

và sau đó trích một bản tóm tắt nhỏ

- Như đã nêu ở trên, tiêu chí chính khi thiết kế thuật toán lý thuyết là tính hiệu quả Điều này đã kích thích sự phát triển của các cấu trúc dữ liệu rất tinh vi –cho dù đối với nhiều cấu trúc, liệu chúng có được thực hiện một cách hợp lý hay không vẫn

là một câu hỏi Tuy nhiên, trong thực tế, ngoài tính hiệu quả, những mục tiêu thiết kế khác đều có vai trò quan trọng như nhau, đôi khi tầm quan trọng của một tiêu chí nào

Trang 21

đó thậm chí còn được đặt cao hơn, chẳng hạn tính linh hoạt, dễ sử dụng, bảo trì, Trong thực tế, cấu trúc dữ liệu và các thuật toán đơn giản được ưa thích hơn những cái phức tạp

- Các khía cạnh lý thuyết về các thuật toán thường đưa ra một bài thuyết trình cấp cao, còn các chi tiết cần thiết để bắt đầu thực hiện thì để lại cho người đọc

- Sự khởi đầu dễ dàng nhất để nghiên cứu và phát triển ý tưởng thuật toán mới

là từ vấn đề đơn giản Tuy nhiên, cùng với tiến độ chung trong khoa học máy tính và

sự sẵn có của sức mạnh tính toán, các ứng dụng tự trở nên phức tạp hơn Các ứng dụng như vậy đòi hỏi một mô hình cẩn thận Câu hỏi đặt ra là liệu kiến thức học được cho các mô hình đơn giản có thể thay thế những mô hình phức tạp hơn

- Dữ liệu đầu vào thực thường không phải là cấu trúc của các trường hợp khó nhất được sử dụng trong phân tích lý thuyết Do đó rất có thể là hiệu suất dự đoán là không khả dụng

- Công việc thử nghiệm tốt đòi hỏi sự nỗ lực đáng kể (thời gian, nhân lực, kỹ năng lập trình, kinh nghiệm, )

Trong nhiều thiết lập thử nghiệm, người ta thực hiện các thí nghiệm với các trường hợp ngẫu nhiên Điều này có thể gây hiểu nhầm lớn Ví dụ, một vài đồ thị ngẫu nhiên có một số thuộc tính cấu trúc làm cho chúng khác biệt với đồ thị trong thế giới thực Một ví dụ khác phát sinh trong tính toán hình học: một bộ mẫu thống nhất của các điểm đảm bảo chắc chắn các điểm sẽ ở vị trí tùy ý Tuy nhiên trong thực tế, rất có khả năng không thực hiện giả thiết này

Thật không may, làm việc với các dữ liệu đầu vào thực tế cũng có vấn đề của nó: Những dữ liệu này có thể không có sẵn cho các nhà nghiên cứu hoặc có thể là độc quyền Để thu hẹp khoảng cách giữa thực tế và lý thuyết, Kỹ nghệ thuật toán (Algorithm Engineering) đòi hỏi một phương pháp mở rộng hơn Tuy nhiên, Algorithm Engineering sẽ phải giữ được những lợi thế của lý thuyết:

- Tính tổng quát,

Trang 22

- Độ tin cậy, và

- Khả năng dự đoán

Hy vọng là Algorithm Engineering sẽ làm tăng tác động của nó trên các lĩnh vực khác một cách đáng kể Kỹ nghệ thuật toán sẽ làm cho việc chuyển giao các ứng dụng được tăng tốc

1.6.1.3 Định nghĩa Kỹ nghệ thuật toán (Algorithm Engineering)

Một số chi tiết của Algorithm Engineering đã được trình bày tại các hội thảo của DIMACS Implementation Challenges (http://dimacs.rutgers.edu/Challenges/): "Những vấn đề được thực hiện bởi DIMACS giải quyết câu hỏi về việc xác định hiệu suất thuật toán thực tế nơi mà những phân tích trường hợp xấu nhất là quá

bi quan và mô hình xác suất là quá phi thực tế: việc thử nghiệm có thể cung cấp các hướng dẫn để thực hiện thuật toán thực tế khi mà phân tích không thành công

Thí nghiệm cũng mang thuật toán gần gũi hơn với các vấn đề ban đầu, tạo nên động lực cho các công trình lý thuyết Nó cũng góp phần kiểm tra rất nhiều giả định

về phương pháp thực hiện và cấu trúc dữ liệu Nó tạo ra một cơ hội để phát triển và kiểm tra vấn đề, máy phát ví dụ, và các phương pháp khác để kiểm tra và so sánh hiệu suất của thuật toán Đó là một bước tiến trong việc chuyển giao công nghệ bằng cách cung cấp các hệ thống xử lý của các thuật toán cho những người khác để sửa đổi thích hợp

Kể từ năm 1990, khi First Challenge bắt đầu với dòng chảy mạng, tổng cộng chín thách thức thực hiện đã được tiến hành Thuật ngữ Algorithm Engineering lần đầu tiên được sử dụng với độ đặc hiệu và tác động đáng kể trong năm 1997, với việc

tổ chức Hội thảo đầu tiên về Algorithm Engineering (WAE 1997) Một vài năm trước đây, David Bader, Bernard Moret, và Peter Sanders định nghĩa như sau:

"Algorithm Engineering đề cập đến quá trình cần thiết để biến đổi một thuật toán từ bút chì trên giấy thành hiện thực, hiệu quả, kiểm nghiệm tốt, và dễ dàng sử dụng Vì vậy, nó bao gồm một số chủ đề, từ hành vi mẫu bộ nhớ cache đến các

Trang 23

nguyên tắc của công nghệ phần mềm; tuy nhiên trọng tâm chính của nó là thử nghiệm "

Chúng ta đồng ý rằng tất cả các chủ đề được đề cập đều là những phần quan trọng của Algorithm Engineering, nhưng vẫn muốn có một cái nhìn rộng hơn về vấn

đề này Một định nghĩa tổng quát hơn đã xuất hiện trong thông báo của ALCOM-FT

Summer School về Algorithm Engineering năm 2001:

"Algorithm Engineering liên quan với việc thiết kế, phân tích lý thuyết và thực nghiệm, kỹ thuật và điều chỉnh các thuật toán, và đang thu hút được sự quan tâm ngày càng tăng trong cộng đồng những người nghiên cứu thuật toán Quy tắc mới nổi này giải quyết các vấn đề về hiệu suất thuật toán thực tế bằng cách kết hợp cẩn thận các phương pháp lý thuyết truyền thống cùng với các khảo sát thực nghiệm kỹ lưỡng

"(Đăng trong DMANET vào ngày 17 tháng năm 2001 bởi Guiseppe Italiano)

Các kết quả của các thí nghiệm lần lượt có thể dẫn đến giả thuyết hay lý thuyết

mới, v.v… Cũng giống như công nghệ phần mềm, Algorithm Engineering không phải

là một quá trình đơn giản Lý tưởng nhất, người ta sẽ thiết kế một thuật toán, thực hiện nó, và sử dụng nó Tuy nhiên, các thuật toán tối ưu, tức là thuật toán tốt nhất để giải quyết vấn đề trong một ứng dụng, và bước thực hiện cuối cùng không được biết trước

Trong Algorithm Engineering, một bằng chứng lý thuyết cho sự phù hợp đối

với một mục đích cụ thể được thay thế bởi một đánh giá thực nghiệm Ví dụ, thử nghiệm đó giúp kiểm tra liệu code được thiết lập có hiệu quả hoặc trong trường hợp thuật toán gần đúng, thì mới có hiệu quả

Trang 24

Thông thường, để đưa ra các kết quả đánh giá thực nghiệm đòi hỏi một phiên bản thiết kế và thực hiện nữa Vì vậy, như đã nêu trong DFG Priority Program 1307 [556]:

"Cốt lõi của Algorithm Engineering là một chu kỳ điều khiển bởi các giả

thuyết giả định." [Www.algorithm-engineering.de]

Thông thường, phân tích được coi là một phần của chu kỳ này, dẫn đến một chu kỳ mà trong đó bao gồm thiết kế, phân tích, thực hiện và đánh giá thử nghiệm các thuật toán thực tế Tuy nhiên, vì kết quả phân tích của thiết kế sẽ ngay lập tức đưa ra phản hồi cho các nhà thiết kế và không đi qua thực hiện và thử nghiệm đầu tiên, nó

có vẻ thích hợp hơn khi để cho các giai đoạn phân tích là một phần của chu kỳ riêng cùng với các thiết kế thuật toán Như vậy, trong Hình 1.3, chu trình cốt lõi ở trung tâm chỉ bao gồm thiết kế, thực hiện và thử nghiệm

Algorithm Engineering luôn luôn được thúc đẩy bởi các ứng dụng thực tế

Kịch bản ứng dụng xác định các phần cứng mà phải được làm giống thực nhất Trong

giai đoạn đầu tiên của Algorithm Engineering, không chỉ là một mô hình máy tính tốt

đã được chọn, mà còn là vấn đề tự nó đã được mô hình hóa một cách thích hợp, mà thường là bị loại trừ từ thiết kế thuật toán Kết quả của một giai đoạn thử nghiệm có thể sau đó yêu cầu một phiên bản của giai đoạn mô hình, vì các mô hình được lựa chọn là không thích hợp Đôi khi việc phân tích các mô hình được lựa chọn đã có thể tiết lộ bất cập của nó Điều này tạo ra một chu kỳ khác bao gồm các ứng dụng, mô hình hóa và phân tích Các ứng dụng cũng cung cấp dữ liệu thực tế để đánh giá thử nghiệm và đánh giá thực nghiệm có thể tiết lộ nhu cầu xem xét thêm một số khía cạnh khác cho loại dữ liệu cụ thể Các thành phần đáng tin cậy từ các thư viện phần mềm có thể dễ dàng hóa các nhiệm vụ Người ta cho rằng một chương trình thiết kế tốt nên được cung cấp trong một thư viện phần mềm để có thể tái sử dụng

Rõ ràng, đây là một sự phụ thuộc tuần hoàn trong Algorithm Engineering

Chúng ta dừng thảo luận với một trích dẫn từ DFG Priority Program 1307:

Trang 25

"Mô hình thực tế cho cả máy tính và các ứng dụng, cũng như các thư viện thuật toán và các bộ sưu tập dữ liệu đầu vào thực tế cho phép tạo ra cầu nối chặt chẽ với các ứng dụng." [Www.algorithm-engineering.de]

1.6.1.5 Tình trạng của Kỹ nghệ thuật toán

Có rất nhiều hội nghị nói về kỹ nghệ thuật toán nhưng đa phần đều chỉ là một phần nội dung của hội nghị chứ không phải tất cả Hội nghị đầu tiên dành riêng cho

kỹ nghệ thuật toán là Workshop on Algorithm Engineering (WAE) được tổ chức tại

Venice (Italy) vào ngày 11 – 13, tháng 9 năm 1997 Đó là điểm khởi đầu của một loạt các hội nghị hàng năm Tại hội nghị WAE 5 ở Aarhus, Đan Mạch, 2001, WAE đã trở thành một trong những hội nghị hàng đầu Châu Âu về các thuật toán ESA Kể từ đó hội nghị WAE trở thành hội nghị kiểu mẫu được công nhận Sau WAE, một loạt hội nghị ALENEX (Algorithm Engineering and Experiments) được tổ chức và thành lập ALENEX diễn ra hàng năm và chia sẻ với SODA, ACM-SIAM Symposium on Discrete Algorithms về các thuật toán Discrete Một trong những hội nghị mới về kỹ nghệ thuật toán là SEA, hội nghị quốc tế về thực nghiệm thuật toán cho đến năm

2009 vẫn được biết đến là hội nghị WEA (Workshop on Experimental Algorithms)

Hình 1.3 Kỹ nghệ thuật toán

Tạp chí chính thức cho lĩnh vực này là tạp chí ACM Journal of Experimental Algorithmics được xuất bản năm 1996 Tạp chí trở thành một kết nối cho các hoạt

Trang 26

động nghiên cứu trong khi các tạp chí chuyên ngành khác như Journal of Graph Algorithms and Applications đề cập tới kinh nghiệm (hoạt ảnh, việc triển khai, số lần thử nghiệm) về các thuật toán trên đồ thị Vào năm 2009, tạp chí Mathematical Programming Computation được xuất bản dành cho việc nghiên cứu, tính toán các vấn đề về lập trình toán học theo nghĩa rộng

1.6.2 Nền tảng của kỹ nghệ thuật toán

1.6.2.1 Mô hình hóa các bài toán

Công việc truyền thống lý thuyết về thuật toán bắt đầu với một bài toán phát biểu như sau:

"Cho một tập hợp các điểm trong mặt phẳng ở vị trí tùy ý, tính toán một số cấu trúc X ", nơi cấu trúc X có thể là các bao lồi, Delaunay triangulation, cây tối thiểu Steiner, hoặc tương tự

Trước khi thiết kế thuật toán, một yêu cầu đặt ra là cần cẩn thận phân tích và hình thức hóa của vấn đề là cần thiết Đối với các ứng dụng phức tạp, giai đoạn mô hình này là một nhiệm vụ quan trọng và đòi hỏi cao Việc tìm kiếm hoặc lựa chọn một mô hình thích hợp có thể đảm bảo cho sự thành công của việc tiếp cận thuật toán Đôi khi ranh giới giữa thời gian đa thức và các vấn đề NP khó được ẩn trong một chi tiết nhỏ vẻ như vô hại Điều này ảnh hưởng rất nhiều đến các loại phương pháp tiếp cận thuật toán cần cân nhắc trong giai đoạn thiết kế

1.6.2.2 Thiết kế thuật toán

Sự phát triển của các thuật toán thường được dựa trên khái niệm trừu tượng và đơn giản hóa giả định đối với các mô hình tính toán và tính chất cụ thể của đầu vào

Để chắc chắn rằng một thuật toán thực hiện trong thực tế, cần đảm bảo thuật toán chứa các phần giá trị quan trọng Các phần bao gồm độ chắc chắn về trị số và các vấn

đề không chắc chắn liên quan trong hình học tính toán

Trang 27

1.6.2.3 Phân tích thuật toán

Mục đích của việc phân tích thuật toán là để đánh giá các tài nguyên mà các thuật toán yêu cầu

Đáng tiếc, tất cả các kỹ thuật này luôn có nhược điểm Phân tích trường hợp xấu nhất thường là quá bi quan đối với các trường hợp xảy ra trong thực tế, trong khi phân tích trường hợp trung bình việc giả định một xác suất phân bố nhất định trên tập hợp các yếu tố đầu vào thường rất khó để lựa chọn trường hợp điển hình mà nó phản ánh Kỹ nghệ thuật toán là quan tâm đến việc phân tích các thuật toán để biết thêm

mô hình đầu vào thực tế Nếu chúng ta cho đầu vào bất kỳ, chúng ta phân tích chứng minh cho nhiều thuật toán trường hợp tồi tệ ít nhất Tuy nhiên, trong thực tế một số các thuật toán có thể thực hiện khá tốt trong khi có khẳng định dự đoán của chúng ta khiêm tốn Để thu hẹp khoảng cách giữa dự đoán lý thuyết và quan sát thực tế, cần nghiên cứu cấu trúc của các đầu vào kỹ lưỡng hơn

1.6.2.4 Mô hình máy tính thực tế

Các mô hình RAM đã rất thành công một mô hình máy tính trong lý thuyết thuật toán Nhiều phương pháp hiệu quả đã được thiết kế bằng cách sử dụng mô hình này Trong khi mô hình RAM là một khái niệm trừu tượng hợp lý của máy tính hiện tại nó không phải là một mô hình tốt cho các máy tính hiện đại nữa trong nhiều trường hợp Các mô hình RAM cơ bản là một máy xử lý duy nhất với bộ nhớ truy cập ngẫu nhiên không giới hạn với chi phí truy cập không đổi Máy tính hiện đại không

có một loại bộ nhớ duy nhất với chi phí truy cập không đổi nữa, nhưng hệ thống phân cấp bộ nhớ với chi phí tiếp cận rất khác nhau Ngày nay các bộ dữ liệu thường rất lớn

mà chúng không phù hợp trong bộ nhớ chính của một máy tính Nghiên cứu thuật toán hiệu quả làm phát sinh mô hình mới cho thiết kế tốt hơn và dự đoán hiệu quả thực tế của các thuật toán khai thác bộ nhớ phân cấp hoặc làm việc với các bộ dữ liệu đòi hỏi phải sử dụng bộ nhớ bên ngoài Nhược điểm của RAM đối với kiến trúc máy tính hiện đại và mới tốt hơn, các mô hình máy tính thực tế hơn Đặc biệt, các chương

Trang 28

trình bày các mô hình thuật toán bộ nhớ ngoài, I / O- efficiency, cấu trúc dữ liệu bộ nhớ ngoài, và các mô hình các thuật toán khai thác cache

Hơn nữa, kiến trúc máy tính hiện đại không phải là các máy xử lý đơn nữa Chúng ta cũng xem xét mô phỏng các thuật toán song song cho thiết kế bộ nhớ ngoài hiệu quả các thuật toán Các mô hình được trình bày tất cả các thiếu sót của mô hình RAM và là địa chỉ tin cậy các mô hình thực tế hơn cho các máy tính hiện đại Tuy nhiên, các mô hình vẫn không cho phép dự đoán hoàn hảo của các hành vi của các thuật toán được thiết kế cho những mô hình trong thực tế và do đó có thể không làm thí nghiệm không cần thiết

1.6.2.5 Thực hiện

Thực hiện là mức thấp nhất và thường chiếm nhiều thời gian trong các tiến trình kỹ nghệ thuật toán Nó liên quan đến mã hóa các kết quả của giai đoạn thiết kế thuật toán trong các ngôn ngữ lập trình được lựa chọn Tất nhiên, khi chúng ta bắt đầu với giai đoạn thực hiện, chúng ta giả định rằng thuật toán chúng ta thiết kế là chính xác, trừ khi chúng ta nhằm mục đích cho các thí nghiệm cung cấp cho chúng ta cái nhìn sâu sắc hơn vào sự đúng đắn của một phương pháp Đặc biệt là kiểm tra chương trình đã được chứng minh là rất hữu ích trong Algorithm Engineering

1.6.2.6 Thư viện

Thư viện phần mềm vừa là một công cụ rất hữu ích và cũng là một chủ đề trong Algorithm Engineering Một thư viện cung cấp các thử nghiệm đã được kiểm tra chính xác và hiệu quả cùng phần mềm thiết kế tốt để tái sử dụng trong các dự án

do đó giảm bớt công việc thực hiện của bạn

Mặt khác, thiết kế và kỹ thuật để tạo một thư viện phần mềm tốt là mục tiêu chính của Algorithm Engineering Thư viện phần mềm có khả năng tăng cường chuyển giao công nghệ từ thuật toán cổ điển đến lập trình thực tế, cung cấp thông tin

về thuật toán Kỹ nghệ thuật toán dành cho các thư viện phần mềm là khó khăn hơn

vì bạn không phải là một nhà tiên nghiệm có thể tiên đoán được bối cảnh ứng dụng của phần mềm của bạn và do đó bạn không thể điều chỉnh theo hướng bối cảnh này

Trang 29

Do đó, tính linh hoạt và khả năng thích ứng là mục tiêu thiết kế quan trọng cho các

thư viện phần mềm

Có nhiều thư viện phần mềm cho các cấp lập trình khác nhau, từ thư viện I/O thông qua các thư viện cung cấp các thuật toán cơ bản và cấu trúc dữ liệu để thư viện thuật toán cho các tác vụ riêng Các thư viện cấp thấp trước đây thường được vận chuyển với các trình biên dịch hoặc là một phần của nền tảng phát triển Thư viện cũng có những dạng khác nhau Đôi khi, các bộ sưu tập của các phần mềm dành cho các tác vụ có liên quan đã được gọi là một thư viện Do đó, một tập hợp lỏng lẻo của các chương trình khó sử dụng, không mạch lạc và khó có thể mở rộng

1.6.2.7 Thí nghiệm

Như chúng ta đã giải thích trước đây, các thí nghiệm có một vai trò quan trọng trong chu kỳ Algorithm Engineering Việc thiết kế và lập kế hoạch của các thí nghiệm sâu sắc, các hoạt động của thí nghiệm và đánh giá là những nhiệm vụ thử thách trong đó có chứa nhiều khó khăn không thể lường trước Jon Bentley đã chỉ ra tại một số lí do mà đôi khi thí nghiệm nhỏ có thể phát hiện ra những hiểu biết đáng ngạc nhiên Nói chung, thực nghiệm đòi hỏi một số kế hoạch cẩn thận và hệ thống Bước đầu tiên là xác định các mục tiêu của một thử nghiệm để tìm ra những loại thử nghiệm là cần thiết, những gì để đo lường và những yếu tố nào sẽ được khám phá Bước tiếp theo là để chọn trường hợp thử nghiệm phù hợp Kể từ khi các kết quả được thử nghiệm trên dữ liệu đầu vào ngẫu nhiên thường rất ít liên quan thực sự cho ứng dụng một nhu cầu chuẩn các bộ thử nghiệm Như vậy, tạo ra dữ liệu thử nghiệm

và các thiết lập và duy trì kiểm tra các thư viện dữ liệu là rất quan trọng

Một quyết định quan trọng mặc dù thường bị bỏ qua khi tiến hành tất cả thí nghiệm Khoa học Máy tính là đảm bảo khả năng tái sử dụng Ít nhất điều này có nghĩa là tất cả các yếu tố đó có thể có ảnh hưởng trực tiếp hoặc gián tiếp vào việc tính toán và sử dụng điều khiển phiên bản để lưu trữ toàn bộ các môi trường tính toán (bao gồm không chỉ lập trình mã nguồn mà còn là trình biên dịch và các thư viện phần mềm bên ngoài) Các bước quan trọng cuối cùng trong quá trình thử nghiệm là

Trang 30

để phân tích dữ liệu thu thập được, để rút ra kết luận bằng các phương pháp thống kê

và báo cáo kết quả Ngược lại với các ngành khoa học tự nhiên và lĩnh vực tương tự như Toán học, Lập trình và hoạt động nghiên cứu, khoa học máy tính không có truyền thống lâu dài làm thí nghiệm Mặc dù ít tốn kém hơn nhiều so với trong khoa học tự nhiên, thực nghiệm là một quá trình rất tốn thời gian mà thường được đánh giá thấp

1.6.2.8 Kết quả báo cáo của Algorithm Engineering

Đến nay, đã có nhiều người nổi tiếng, các công ty cạnh tranh cao như Google Inc., Akamai Technologies, và Nhóm Celera Genomics có vị trí vững chắc của mình trên thị trường đến một mức độ rộng lớn cũng từ Algorithm Engineering

Một trong những ví dụ ấn tượng nhất đối với tiến bộ vững chắc trong năm do Algorithm Engineering là phương pháp chương trình tuyến tính và các thuật toán đơn hình Chúng ta hãy xem lại ngắn gọn một số sự kiện quan trọng của khả năng để giải quyết Qui hoạch tuyến tính Năm 1949, khi George B Dantzig đã phát minh ra thuật toán đơn hình, phải mất 120 ngày công để tính toán bằng tay phương án tối ưu cho bài toán với 9 ràng buộc và 77 biến Năm 1952, người ta có thể giải quyết bài toán với 48 ràng buộc và 71 biến trong 18 giờ tại Cục Tiêu chuẩn Quốc gia Khoảng hai mươi năm sau, vào năm 1970, đã giải được bài toán qui hoạch tuyến tính với khoảng

4000 ràng buộc và 15.000 biến

1.7 Mục tiêu và kết quả của Luận văn

Mục tiêu của luận văn này là mô tả, phân tích, thực hiện và kiểm tra thuật toán MST tối ưu của Pettie và Ramachandran [13] Thời gian chạy của thuật toán sẽ được

so sánh với thời gian chạy của các thuật toán MST khác với sự phức tạp về mặt lý thuyết cao hơn Thuật toán MST tối ưu cơ bản là một phần của phương pháp thuật toán nổi tiếng Chúng được thể hiện trong Fredman và Tarjan [8], Chazelle [6], Mares [12], cũng như các bài báo đầu tiên của Boruvka [4]và Jarn'ık [9] Chương 2 của luận văn này được dành riêng để mô tả các phương pháp này Thuật toán MST tối ưu cũng

Trang 31

được mô tả và phân tích trong Chương 3 và thời gian chạy được so sánh với các thuật

toán MST khác trong Chương 4

Kết quả

Chúng tôi đã thử nghiệm thời gian chạy của thuật toán MST tối ưu và các

thuật toán MST khác trong luận văn này trên các đồ thị khác nhau Thuật toán MST

tối ưu có chi phí cao trong thời gian chạy so với các thuật toán MST khác mà chúng

tôi đã thực nghiệm Nói cách khác, các ẩn hằng số trong đánh giá tiệm cận chi phối

thời gian chạy của nó, , là cao so với các thuật toán khác Vì vậy ẩn hằng

Big-Oh có thể chi phối thời gian chạy của thuật toán MST tối ưu cho các trường hợp

đồ thị thực tế Chú ý, thực tế có một giới hạn trên về kích thước của đồ thị thử

nghiệm chúng ta có thể tạo ra, vì vậy điều này cũng có thể áp dụng cho trường hợp đồ

thị thử nghiệm của chúng tôi Nói tóm lại, giả thuyết này được xác nhận bởi các thí

nghiệm Thuật toán DJP nói chung là nhanh nhất và thuật toán MST tối ưu thường là

chậm nhất

Do đó, đối với trường hợp đồ thị thực tế, các thuật toán MST tối ưu của Pettie

và Ramachandran [13] cung cấp không có lợi cho việc giải quyết bài toán MST

Trang 32

Chương 2 CẤU TRÚC DỮ LIỆU VÀ CÁC THUẬT TOÁN GIẢI BÀI TOÁN MST

2.1 Khối xây dựng cơ bản

2.1.1 Hàng đợi ưu tiên

Một kiểu dữ liệu trừu tượng nổi tiếng là hàng đợi ưu tiên Một hàng đợi ưu tiên lưu trữ cặp ( , ), với là một phần tử và là các khóa kết hợp với Các hàng đợi ưu tiên trình bày trong luận văn này đều dựa trên những cây nhị phân được sắp thứ tự, đặc biệt tất cả chúng là đống min Tóm lại, đống là một cây có gốc, và tất cả các nút được lưu trữ theo thứ tự đống, khóa của một nút luôn nhỏ hơn hoặc bằng khóa của các nút con của nó Do đó, nút gốc luôn lưu giữ phần tử với khóa nhỏ nhất Ngoại trừ các Đống mềm đặc biệt, luận văn này không nói về hàng đợi ưu tiên, vì vậy chúng tôi sẽ nêu ngắn gọn các giao diện hoạt động phổ biến của một hàng đợi ưu tiên:

𝒊𝒏𝒔𝒆𝒓𝒕(𝒆, 𝒌): Chèn phần tử e với khóa k vào hàng đợi

𝒇𝒊𝒏𝒅𝑴𝒊𝒏: Trả về phần tử với khóa tối thiểu trong hàng đợi

𝒅𝒆𝒍𝒆𝒕𝒆𝑴𝒊𝒏: Xóa và trả về phần tử với khóa tối thiểu trong hàng đợi

𝒅𝒆𝒄𝒓𝒆𝒂𝒔𝒆𝑲𝒆𝒚(𝒆, 𝜟): Giảm khóa của phần tử bằng Để thực hiện có hiệu quả,

một số hàng đợi cũng đòi hỏi một tham chiếu đến nút đang lưu trữ e trong hàng đợi

𝒅𝒆𝒍𝒆𝒕𝒆(𝒆): Xóa phần tử khỏi hàng đợi Một lần nữa, để thực hiệu quả, một số hàng

đợi cũng đòi hỏi một tham chiếu đến nút đang lưu trữ e trong hàng đợi

𝒎𝒆𝒍𝒅(𝑸): Hợp nhất hàng đợi Q vào hàng đợi

Trong luận văn này, sẽ không cần xóa các phần tử tùy ý cũng không ghép chung đống Do đó, sẽ không cần các phép toán 𝑑 𝑙 𝑡 và 𝑙𝑑

Tóm lại, phép toán 𝑑 𝑙 𝑡 𝑀 của Đống mềm [6] có thể trả về một phần tử sai, vì đống tạo lỗi một số phần tử khóa Thời gian chạy của Đống mềm phụ thuộc vào tỷ lệ lỗi 0 < 𝜀 <1/2, được khởi tạo với hàng đợi ưu tiên Tỷ lệ lỗi cũng chi phối

Trang 33

giới hạn trên về số lượng các phần tử lỗi trong đống Thời gian chạy của đống nhị phân cổ điển đơn giản [7], [15], Đống Fibonacci cao cấp [8], [3], và Đống mềm được thể hiện trong Bảng 2.1.1, trong đó là số phần tử trong đống

Bảng 2.1 Thời gian thực hiện của đống nhị phân, đống Fibonaccis, và Đống mềm

2.1.2 Kết nối đồ thị và sơ đồ tổng quát của các thuật toán MST

Các thuật toán MST mô tả trong luận văn này, bao gồm thuật toán tối ưu, sử dụng đồ thị kết nối, do đó phần này được dành riêng cho một mô tả về phương pháp kết nối Đầu tiên, một định nghĩa của các kí hiệu

Định nghĩa: Cho là một đồ thị con của Đồ thị được sinh ra từ bằng cách kết nối từng thành phần liên thông trong được ký hiệu là

2.1.2.1 Sơ đồ của thuật toán MST tổng quát

Nhiều thuật toán MST xây dựng trên cơ sở lặp đi lặp lại thao tác nhận biết một cạnh MST (ví dụ như sử dụng thuộc tính cắt trong định lý 1.4.2), kết nối hai cụm riêng biệt cho đến khi tìm được tất cả các cạnh MST Ở đây, một cụm là một tập các đỉnh và tất cả các cụm thường tách rời Ban đầu chúng ta xác định mỗi đỉnh là một cụm Khi một cạnh MST mới được phát hiện, nó được thêm vào tập các cạnh MST,

và các cụm tương ứng với hai điểm đầu cuối của cạnh được kết hợp thành một cụm, chúng cùng nhau tạo thành một thành phần liên thông của các cạnh MST Bằng cách làm này, mỗi lần thực hiện một lần lặp của vòng lặp bên ngoài tương ứng với một lần lặp duy nhất

Trang 34

Thuật toán 2.1.1: Thuật toán MST tổng quát

có thể không thể là một phần của MST do đặc tính chu kỳ Vì vậy chúng ta muốn loại

bỏ các cạnh như vậy Một phương pháp để thực hiện điều này là kết nối mọi thành phần liên thông của cây MST, tức là kết nối các cụm, ở cuối mỗi lần lặp Bằng cách này, sau khi kết nối mỗi đỉnh mới tương ứng với một thành phần liên thông trước khi kết nối Do đó, trước mỗi lần lặp chúng ta có thể "thiết lập lại" các cụm sao cho mỗi đỉnh tương ứng với một cụm

2.1.2.2 Thủ tục kết nối đơn giản

Với kết nối ở cuối mỗi lần lặp, của các thuật toán Boruvka và Thuật toán

“trong trường hợp đồ thị dày” không cần phải xác định một cách rõ ràng và hợp nhất các cụm riêng biệt Ngoài ra các thuật toán có thể tự hạn chế để chỉ đánh dấu một cạnh MST mà không cần thêm nó vào một khi nó được phát hiện Điều này cũng sẽ làm cho nó dễ dàng hơn để kiểm tra xem một cạnh đặc biệt là ở trong MST Vì vậy chúng tôi sẽ mô tả kết nối cho đồ thị không có các cụm liên kết Sự kết nối mô tả đầu tiên trong chương này có thể đạt được bằng cách:

Trang 35

• Phát hiện các thành phần liên thông bằng các cạnh MST được gán nhãn Gán cho mỗi đỉnh các thành phần nó thuộc về Đây là một phát hiện cụm chậm

• Xây dựng một đồ thị kết nối mới ′ với:

cụ thể là tất cả các cạnh với cả hai điểm đầu cuối trong cùng một thành phần

Tìm kiếm theo chiều sâu và phát hiện của các thành phần được kết nối

Duyệt đồ thị là một phương pháp để kiểm tra tất cả các đỉnh và các cạnh trong một đồ thị Depth-First Search (DFS) của đồ thị là một phương pháp duyệt chuẩn

Duyệt DFS có thể được sử dụng để phát hiện thành phần liên thông trong một

đồ thị, và liên kết một số thành phần duy nhất cho mỗi đỉnh: Ban đầu, đánh dấu tất cả các đỉnh như chưa được xét và thiết lập một biến số thành phần tổng quát =0 Sau đó, lặp lại tìm một đỉnh chưa được xét trong đồ thị, chọn 𝑣, gọi DFS mở rộng trên 𝑣, và tăng bằng một Đối với mỗi DFS đệ quy mở rộng, thuật toán kết hợp số thành phần với đỉnh hiện tại Một đỉnh chưa được xét một cách có hiệu quả có thể được tìm thấy duy trì một tham chiếu đến đỉnh chưa được xét đầu tiên trong danh sách các đỉnh

Thuật toán kết nối

Bên cạnh đồ thị kết nối, chúng ta có thể dễ dàng khái quát các thuật toán chung cho một MSF (như trái ngược với MST) bằng cách thay đổi các điều kiện lặp thuật toán Khi một thành phần liên thông của MST được tìm thấy, các thành phần

Trang 36

được kết nối với một đỉnh duy nhất Do đó, đồ thị có một tập cạnh trống khi từng thành phần liên thông của MST được tìm thấy Vì vậy, các điều kiện vòng lặp mới là

đồ thị hiện tại có một tập cạnh khác rỗng

Giả sử 𝑠𝑠 𝑝 𝑡 𝑢 𝑏 𝑟𝑠( ) là một phiên bản sửa đổi của duyệt DFS mở rộng đồ thị được mô tả ở trên, mà chỉ xử lý MSF đánh dấu cạnh của đồ thị Cho (𝑣) là số thành phần giao với đỉnh 𝑣 Đó là, (𝑣) là MSF thành phần liên thông thuộc 𝑣 Các bước kết nối được định nghĩa chính thức trong Thuật toán 2.1.2 Các thuật toán MSF sửa đổi với lần duyệt chung được định nghĩa trong Thuật toán 2.1.3

Thuật toán 2.1.2: ế ố - Thuật toán kết nối đơn giản

Gán số thành phần (G)

forall cạnh (a, b) trong E(G) do

if (a, b) được đánh dấu bằng một cạnh MSF then

Thêm cạnh ban đầu của (a, b) cho T

else if then

Thêm e cho G 'với một tham chiếu đến các cạnh ban đầu (a, b)

ế ố

return T

Thời gian chạy

Trang 37

Giai đoạn đầu của là một DFS sửa đổi của , mà cần có thời gian Giai đoạn hai xây dựng một đồ thị mới của n đỉnh tối đa Thời gian là Giai đoạn thứ ba duyệt tất cả các cạnh và làm việc liên tục trong mỗi lần lặp,

do đó thời gian là Như vậy tổng thời gian chạy của kết nối là trong đó

là số cạnh của đồ thị đầu vào

Một giải pháp để đạt được sự cải thiện này được đưa ra bởi Mares [Mar04] Chúng ta sẽ thay đổi vòng lặp của kết nối ( ) trong Thuật toán 2.1.2 thỏa mãn:

1 Cho ′= | ( ′)| Đó là số lượng các thành phần liên thông được tìm thấy Khởi tạo vùng chứa n', chọn 𝑏 𝑏 Sau đó, cho mỗi cạnh trong ( ), giả sử i là số

thành phần điểm đầu nút tối đa, và chèn các cạnh vào vùng chứa b i Giống như trong phương án đơn giản, thêm cạnh MST đánh dấu với T và loại bỏ cạnh với điểm đầu

nút trong cùng một thành phần trong quá trình này Thời gian:

(| ( )| + | ( ′)|) = (| ( )|)

2 Khởi tạo vùng chứa mới của danh sách liên kết, chọn 𝑏 𝑏 Sau

đó tăng , lấy mỗi cạnh trong vùng chứa 𝑏: giả sử là số điểm đầu nút tối thiểu của các cạnh thành phần, và đặt cạnh vào vùng chứa 𝑏 Đối với mỗi vùng chứa trong , quá trình này sẽ mang lại cùng các cạnh với số lượng tối đa các thành phần tương tự

Trang 38

Đó là, được đem đến các cạnh song song Trong tổng số đó là phân loại cơ số bằng số thành phần điểm đầu nút của cạnh với điểm đầu nút trong các thành phần riêng biệt Thời gian: (| ( )| + | ( ′)|) = (| ( )|)

3 Đối với mỗi nhóm của (với số lượng tối thiểu thành phần cạnh tương tự): Hủy

bỏ các cạnh song song không cần thiết Đó là, loại bỏ tất cả các cạnh trừ nhẹ nhất đến mỗi thành phần bên cạnh Thời gian: (| ( )| + | ( ′)|) = (| ( )|)

4 Xây dựng một đồ thị mới với: 1) Một đỉnh cho mỗi thành phần được kết nối 2) Một cạnh cho mỗi cạnh còn lại trong vùng chứa của Mỗi cạnh mới phải có một tham chiếu đến cạnh trong đồ thị ban đầu

Thời gian: (| ( ′)| + | ( ′)|) = (| ( ′)|)

Vì | ( ′)| ≤ | ( )|, quá trình này cần có thời gian (| ( )|) = ( ) là mục tiêu Đối với đồ thị nói chung quá trình này không loại bỏ cạnh đơn giản đầu tiên nhiều hơn thuật toán kết nối trong trường hợp xấu nhất

Thực hiện kết nối

Tại một điểm các thuật toán tối ưu đánh dấu một số cạnh như cạnh MSF, và loại bỏ các cạnh khác trước khi gọi đến kết nối Điều đó là hiển nhiên không thay đổi rằng cả hai cạnh không được đánh dấu có thể là bị loại bỏ như một cạnh MST Rất dễ dàng để mở rộng các thuật toán kết nối để loại bỏ các cạnh được đánh dấu là xóa: Nó đòi hỏi thêm một cấu trúc có điều kiện trong bước lặp cạnh đầu tiên, bỏ đi cạnh đánh dấu là xóa

2.1.3 Thuật toán Kruskal

2.1.3.1 Thuật toán

Thuật toán sẽ xây dựng tập cạnh của cây khung nhỏ nhất theo từng bước Trước hết sắp xếp các cạnh của đồ thị G theo thứ tự không giảm của độ dài( hoặc trọng số) Bắt đầu từ tập ở mỗi bước ta sẽ lần lượt duyệt trong danh sách cạnh đã sắp xếp, từ cạnh có độ dài nhỏ đến cạnh có độ dài lớn hơn, để tìm ra

Trang 39

cạnh mà việc bổ xung nó vào tập không tạo thành chu trình trong tập này Thuật toán sẽ kết thúc khi ta thu được tập gồm −1 cạnh Cụ thể, thuật toán có thể mô tả như sau:

Thuật toán 2.1.4: Thuật toán Kruskal

toán cũng có thể áp dụng để tìm MSF của một đồ thị không liên thông

Trang 40

Định nghĩa một "thành phần" là một đỉnh hay một tập hợp liên thông các đỉnh, sau đây là mã giả của thuật toán Borvvka (không mất tính tổng quát giả sử các cạnh

Trong trường hợp xấu nhất chỉ có cạnh được đánh dấu là cạnh MST trong một bước Do đó số đỉnh (và cạnh) được giảm ít nhất trong mỗi lần kết nối Như vậy tổng thời gian chạy cho các đồ thị nói chung, bỏ qua một số cạnh được xóa giữa các bước, là Vì số lượng các đỉnh được giảm ít nhất trong mỗi lần kết nối, số đỉnh đầu vào bước là lớn nhất và do đó số cạnh là lớn nhất của đỉnh trong đồ thị đầy đủ, cụ thể là Tổng ∑ bị chặn bởi Như vậy thời gian tính cho các đồ thị nói chung là Do đó tổng thời gian tính cho các đồ thị chung sử dụng Boruvka với kết nối là

Ngày đăng: 26/07/2017, 20:57

Nguồn tham khảo

Tài liệu tham khảo Loại Chi tiết
[1] Nguyễn Đức Nghĩa. Bài giảng ''Thiết kế và phân tích thuật toán". Bộ môn Khoa học Máy tính, Đại học Bách khoa Hà nội, 2014 Khác
[2] Nguyễn Đức Nghĩa. Cấu trúc dữ liệu và thuậ toán. NXB Bách khoa Hà nội, 2008 Khác
[3] Claus Andersen and Henrik Bitsch Kirk. Advanced algorithms - data structures 2007, projekt 1 - prioritetskứer. 2007 Khác
[4] O. Boruvka. O jist´em probl´emu minim´aln´ım. Pr´ace Moravsk´e Pˇr´ırodovˇedeck´e Spoleˇcnosti, 3:37–58, 1926. In Czech Khác
[5] Bernard Chazelle. A minimum spanning tree algorithm with inverse-Ackermann type complexity. J. ACM, 47(6):1028–1047, 2000 Khác
[6] Bernard Chazelle. The soft heap: An approximate priority queue with optimal error rate. J. ACM, 47(6):1012–1027, 2000 Khác
[7] Robert W. Floyd. Algorithm 245: Treesort 3. Communications of the ACM, 7(12):701, December 1964 Khác
[8] Michael L. Fredman and Robert Endre Tarjan. Fibonacci heaps and their uses in improved network optimization algorithms. J. ACM, 34(3):596–615, 1987 Khác
[9] V. Jarn´ık. O jist´em probl´emu minim´aln´ım. Pr´aca Moravsk´e P˘r´ırodov˘edeck´e Spole˘cnosti, 6:57–63, 1930. In Czech Khác
[10] David R. Karger, Philip N. Klein, and Robert E. Tarjan. A randomized linear- time algorithm to find minimum spanning trees. J. ACM, 42(2):321–328, 1995.Abstract only Khác
[11] Haim Kaplan and Uri Zwick. A simpler implementation and analysis of Chazelle’s Soft Heaps. To appear, SODA, 2009 Khác
[12] Martin Mareˇs. Two linear time algorithms for MST on minor closed graph classes. Archivum Mathematicum, 40:315–320, 2004 Khác
[13] Seth Pettie and Vijaya Ramachandran. An optimal minimum spanning tree algorithm. J. ACM, 49(1):16–34, 2002 Khác
[14] D.M.Y. Sommerville. An introduction to the geometry of N dimensions. Dover Publ. Inc., New York, 1958 Khác
[15] J. W. J. Williams. Algorithm 232: Heapsort. Communications of the ACM, 7(6):347–348, 1964 Khác
[16] Claus Andersen-An optimal minimum spanning tree algorithm-Master’s Thesis-November 28, 2008 Khác

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w