Tải bản đầy đủ (.docx) (65 trang)

Giải thuật đồ thị trường đại học công nghiệp hà nội

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.44 MB, 65 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
----------------------------

---------------------------

BÁO CÁO
THỰC TẬP CHUYÊN NGÀNH
KỸ THUẬT PHẦN MỀM
ĐỀ TÀI
Các Giải Thuật Đồ Thị
Giáo viên hướng dẫn:

T.S Hoàng Quang Huy

Sinh viên thực hiện:

Ngơ Đình Thơng 2018604381

Lớp:

Kỹ thuật phần mềm 3

Khóa:

13

1


Hà Nội, 2021


TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA CÔNG NGHỆ THÔNG TIN
----------------------------

---------------------------

BÁO CÁO
THỰC TẬP CHUYÊN NGÀNH
KỸ THUẬT PHẦN MỀM
ĐỀ TÀI
Các Giải Thuật Đồ Thị
Giáo viên hướng dẫn:

T.S Hoàng Quang Huy

Sinh viên thực hiện:

Ngô Đinh Thông 2018604381

Lớp:

Kỹ thuật phần mềm 3

Khóa:

13
2


Hà Nội, 2021


LỜI MỞ ĐẦU
Ngày nay, khoa học kĩ thuật ngày phát triển, đặc biệt ngành công nghệ thông tin
Ứng dụng công nghệ tràn ngập mặt đời sống Từ vật chất điện thoại, tivi, tủ lạnh,
điều hòa, điều khiển máy … tới mạng xã hội facebook, zalo, google ….tất ứng
dụng công nghệ thông tin Thế giới ngày đại nghành công nghệ thơng tin ngày phát
triển Chính tầm quan trọng đa dạng ngành cơng nghệ thơng tin mà địi hỏi sinh
viên công nghệ thông tin cần phải nắm vững nguyên lý ứng dụng của học cơng
nghệ thơng tin nói chung các cấu trúc liệu giải thuật nói riêng.
Trong cấu trúc giữ liệu và giải thuật thì các giải thuật vơ cùng quan trọng để ứng
dụng vào các bài toán thực tế. Ví dụ bài tốn chia phịng thi cho sinh viên,….
Trong đề tài nghiên cứu này sẽ nghiên cứu về các giải thuật liên quan đến đồ thị,
những thuật toán cơ bản nhất có thể dễ dàng cài đặt trên máy tính.
Từ những kiến thức đã được học cùng với việc nghiên cứu các tài liệu trên
Internet, và nhất là nhờ sự hướng dẫn, chỉ bảo tận tình của thầy giáo T.S Hoàng
Quang Huy, chúng em đã hoàn thành đề tài này. Nhưng do q trình học về kiến
thức này cịn nhiều khó khăn, và sự hiểu biết của chúng em cịn hạn hẹp nên kết
quả vẫn cịn nhiều thiếu sót.
Kính mong thầy nhận xét và đóng góp ý kiến để nhóm có thể hồn thiện được
bài tập này.

Chân thành cảm ơn thầy!

3


Mục Lục
LỜI MỞ ĐẦU.................................................................................................................................................3
Mở Đầu.............................................................................................................................................................6
1, Lý do chọn đề tài......................................................................................................................................6

2, Mục đích nghiên cứu...............................................................................................................................7
3, Đối tượng và phạm vi nghiên cứu..........................................................................................................7
4, Ý nghĩa khoa học, thực tiễn và kết quả mong muốn đạt được của đề tài...........................................7
5, Cấu trúc báo cáo......................................................................................................................................8
Chương I, Tổng quan về giải thuật đồ thị.......................................................................................................9
1,1 Giới thiệu chung....................................................................................................................................9
1.2 Những vấn đề còn tồn tại...................................................................................................................10
1.3 Định hướng phát triển........................................................................................................................10
Chương 2: Cơ sở lý thuyết...........................................................................................................................10
2.1 Lịch sử phát triển của giải thuật về đồ thị.........................................................................................10
2.2 Các khái niệm.......................................................................................................................................11
2.3 Một số dạng đồ thị cơ bản..................................................................................................................11
2.3.1 Đồ thị vô hướng...........................................................................................................................11
2.3.2 Đồ thị có hướng............................................................................................................................12
2.3.3 Đơn đồ thị và đa đồ thị.................................................................................................................13
2.4 Cấu trúc dữ liệu đồ thị.........................................................................................................................13
2.4.1 Các cấu trúc danh sách...............................................................................................................13
2.4.2 Cấu trúc ma trận..........................................................................................................................14
2.4.2.2 Ma trận kề...............................................................................................................................15
2.4.2.3 Ma trận dân nạp........................................................................................................................19
2.5 Đánh giá độ phức tạp của thuật toán và lựa chọn..........................................................................19
Chương 3: Các giải thuật đồ thị.................................................................................................................21
3.1 Các giải thuật về tô màu đồ thị...........................................................................................................21
3.1.1 Các khái niệm cơ bản..................................................................................................................21
3.1.2 Ứng dụng của tô màu đồ thị......................................................................................................22
3.1.3 Giải thuật......................................................................................................................................23
4


3.1.3.1Bài tốn.......................................................................................................................................23

3.1.3.3 Giải thuật tham lam tơ màu đồ thị...........................................................................................25
3.2 Giải thuật Xếp Hạng – PageRank......................................................................................................29
3.2.1 Khái niệm......................................................................................................................................29
3.2.2 Mô tả thuật tốn...........................................................................................................................30
3.2.3 Giải thuật......................................................................................................................................32
3.3 Các Giải thuật tìm kiếm DFS,BFS....................................................................................................34
3.3.1 Tìm kiếm theo chiều sâu – DFS......................................................................................................34
a, Khái niệm...........................................................................................................................................34
3.3.2 Tìm kiếm theo chiều rộng – BFS................................................................................................39
3.3.3 Giải thuật cây kéo dài tối thiểu...................................................................................................45
a, Khái niệm...........................................................................................................................................45
b, thuật toán của Prim..........................................................................................................................48
c, Thuật toán Kruskal.............................................................................................................................55

5


Mở Đầu
1, Lý do chọn đề tài
Trên thực tế có nhiều bài toán liên quan tới một tập các đối tượng và những mối
liên hệ giữa chúng, địi hỏi tốn học phải đặt ra một mơ hình biểu diễn một cách chặt
chẽ và tổng quát bằng ngôn ngữ ký hiệu, đó là đồ thị. Những ý tưởng cơ bản của nó
được đưa ra từ thế kỷ thứ XVIII bởi nhà tốn học Thuỵ Sĩ Leonhard Euler, ơng đã
dùng mơ hình đồ thị để giải bài toán về những cây cầu Konigsberg nổi tiếng. Qua ví
dụ trên để thấy các giải thuật đồ thị là cần thiết như thế nào đối với các bài toán thực
tế.
Đồ thị được sử dụng để giải quyết nhiều vấn đề trong cuộc sống thực. Đồ thị
được sử dụng để biểu diễn mạng. Các mạng có thể bao gồm các đường dẫn trong
thành phố hoặc mạng điện thoại hoặc mạng mạch. Đồ thị cũng được sử dụng trong
các mạng xã hội như linkedIn, Facebook. Ví dụ, trong Facebook, mỗi người được

biểu diễn bằng một đỉnh (hoặc nút). Mỗi nút là một cấu trúc và chứa thông tin như id
người, tên, giới tính, ngơn ngữ, v.v
Bản nghiên cứu này sẽ chủ yếu liên quan đến các giải thuật đồ thị và cách cài đặt
nó với một ngơn ngữ lập trình.

6


2, Mục đích nghiên cứu
Nội dung báo cáo này sẽ tập trung tìm hiểu và giới thiệu về các giải thuật về đồ
thị. Đây là một trong những bài toán có ứng dụng rất nhiều trong cuộc sống, hay
được thấy nhiều trong môn cấu trúc dữ liệu và giải thuật, toán rời rạc,…
3, Đối tượng và phạm vi nghiên cứu
Báo cáo sẽ tập trung trình bày kết quả nghiên cứu của em về các giải thuật
liên quan đến đồ thị phẳng.
Tuy nhiên, thời điểm hiện tại có rất nhiều giải thuật đồ thị. Vì vậy, phạm vi
nghiên cứu của báo cáo chỉ nghiên cứu vê các giải thuật đô thị hay gặp, có tính
ứng dụng cao trong thực tế như: giải thuật tìm đường đi ngắn nhất, tơ màu đồ thị,
tìm kiếm trên cây,…
Cuối cùng, Sau khi tìm hiểu em sẽ vận dụng kết quả tìm hiểu được vào việc
sử dụng ngơn ngữ java để minh họa các bai tốn cụ thể
4, Ý nghĩa khoa học, thực tiễn và kết quả mong muốn đạt được của đề tài
Có lẽ, hiện nay thì các giải thuật liên quan đến đồ thị có thể áp dụng vào rất
nhiều vào các lĩnh vực khác nhau của đời sống. Lấy ví dụ đơn giản là việc có nhiều
hệ thống phức tạp liên quan đến đồ thị như các hệ thống giao thông, hệ thống mạng,
hệ thống truyền tải điện,..Từ đó, các giải thuật đồ thị áp dụng vào để tìm ra các kết
quả liên quan tới các trường hợp cụ thể như đường đi ngắn nhất để sử dụng dây điện
đỡ tốn kém. Hay một bài toán đơn giản được sử dụng thường xuyên là chia phịng
thi. Nó cũng áp dụng một giải thuật đồ thị đó là tơ màu đồ thị. Xa hơn, các hệ thống
hay website cũng sử dụng các giải thuật về sắp xếp, tìm kiếm dựa trên đồ thị để tiết


7


kiệm thời gian hay bộ nhớ với những dữ liệu lớn, thì việc áp dụng giải thuật đồ thị là
vơ cùng hiệu quả.
Sau khi nghiên cứu các giải thuật vê đồ thị. Kết quả em mong muốn có được
đó là nắm rõ được các giải thuật về đô thị, sau đó áp dụng để cài đặt với ngơn ngữ
java.

5, Cấu trúc báo cáo
Chương 1: Tổng quan về giải thuật đồ thị
Chương 2: Cơ sở lý thuyết
Chương 3: Các giải thuật đồ thị cơ bản
Chương 4: Ứng dụng của giải thuật đồ thị trong cuộc sống
Phần cuối cùng là tài liệu tham khảo và một số phụ lục về hướng dẫn triển khai
ứng dụng.

8


Chương I, Tổng quan về giải thuật đồ thị
1,1 Giới thiệu chung
Đồ thị là một học thuật mơ hình được sử dụng để biểu diễn một đối tượng có
quan hệ với nhau theo một cách nào đó. Hạn chế trong khoa học máy tính, đồ thị
được sử dụng để mơ hình hóa một mạng truyền thơng, kiến trúc của bài hát máy
tính., .. Rất nhiều vấn đề trong các lĩnh vực khác như cơng nghệ điện, học tập , chính
trị, kinh tế, .. cũng có thể biểu diễn bằng thị đồ. Khi một vấn đề được mơ hình hóa
bởi thị đồ, thì vấn đề sẽ được giải quyết bằng cách sử dụng các thuật tốn trên đồ thị.
Vì vậy, thị đồ thuật tốn có phạm vi áp dụng lớn và có đặc biệt quan trọng. Trong

chương trình này, chúng ta sẽ nghiên cứu một số thuật toán quan trọng nhất trên đồ
thị: các thuật toán đi qua đồ thị, các thuật tốn tìm đường đi ngắn nhất, tìm cây bao
ngắn nhất ... Nghiên cứu các thuật tốn đồ thị cịn giúp ta hiểu rõ hơn cách vận dụng
các công cụ thiết kế kỹ thuật (đã được trình bày trong chương 16) để giải quyết các
vấn đề cụ thể
1.2 Những vấn đề còn tồn tại

9


1.3 Định hướng phát triển

Chương 2: Cơ sở lý thuyết

2.1 Lịch sử phát triển của giải thuật về đồ thị
Một trong những kết quả đầu tiên trong lý thuyết đồ thị xuất hiện trong bài
báo của Leonhard Euler về Bảy cây cầu ở Königsberg, xuất bản năm 1736. Bài báo
này cũng được xem như một trong những kết quả topo đầu tiên trong hình học, tức
là, nó khơng hề phụ thuộc vào bất cứ độ đo nào. Nó diễn tả mối liên hệ sâu sắc
giữa lý thuyết đồ thị và
Năm 1845, Gustav Kirchhoff đưa ra Định luật Kirchhoff cho mạch điện để
tính điện thế và cường độ dịng điện trong mạch điện.
Năm 1852 Francis Guthrie đưa ra bài toán bốn màu về vấn đề liệu chỉ với
bốn màu có thể tơ màu một bản đồ bất kì sao cho khơng có hai nước nào cùng biên
giới được tơ cùng màu. Bài toán này được xem như đã khai sinh ra lý thuyết đồ thị,
và chỉ được giải sau một thế kỉ vào năm 1976 bởi Kenneth Appel và Wolfgang
Haken. Trong khi cố gắng giải quyết bài toán này, các nhà toán học đã phát minh ra
nhiều thuật ngữ và khái niệm nền tảng cho lý thuyết đồ thị.

2.2 Các khái niệm

Giải thuật hay cịn được gọi là thuật tốn – tiếng Anh Algorithms: là một tập
hợp hữu hạn các chỉ thị để được thực thi theo một thứ tự nào đó để thu được kết
quả mong muốn. Nói chung thì giải thuật là độc lập với ngơn ngữ lập trình, tức là
một giải thuật có thể được triển khai trong nhiều ngơn ngữ lập trình khác nhau
Một đồ thị (Graph) là một dạng biểu diễn hình ảnh của một tập các đối
tượng, trong đó các cặp đối tượng được kết nối bởi các link. Các đối tượng được
nối liền nhau được biểu diễn bởi các điểm được gọi là các đỉnh (vertices), và các
link mà kết nối các đỉnh với nhau được gọi là các cạnh (edges).
10


Nói chung, một đồ thị là một cặp các tập hợp (V, E), trong đó V là tập các đỉnh và
E là tập các cạnh mà kết nối các cặp điểm. Bạn theo dõi đồ thị sau:

Hình 2.1.1
Trong đồ thị trên:
V = {a, b, c, d, e}
E = {ab, ac, bd, cd, de}

Các thuật toán đồ thị được sử dụng để giải quyết các vấn đề về biểu diễn đồ
thị dưới dạng mạng như các chuyến bay của hãng hàng không, cách kết nối
Internet hoặc kết nối mạng xã hội trên Facebook. Chúng cũng phổ biến
trong NLP và học máy để tạo thành mạng.

2.3 Một số dạng đồ thị cơ bản
2.3.1 Đồ thị vô hướng
Đồ thị vô hướng hoặc đồ thị G là một cặp khơng có thứ tự (unordered
pair) G:=(V, E), trong đó




V, tập các đỉnh hoặc nút,
E, tập các cặp không thứ tự chứa các đỉnh phân biệt, được gọi là cạnh. Hai
đỉnh thuộc một cạnh được gọi là các đỉnh đầu cuối của cạnh đó.

Trong nhiều tài liệu, tập các cạnh bao gồm cả các cặp đỉnh không phân biệt, các
cạnh này được gọi là các khuyên. V (và E) thường là các tập hữu hạn, phần lớn các
kết quả nghiên cứu đã biết không đúng (hoặc khác) khi áp dụng cho đồ thị vô
hạn (infinite graph) vì nhiều luận cứ khơng dùng được trong trường hợp vô hạn.

11


Hình 2.3.1: đồ thị vơ hướng
2.3.2 Đồ thị có hướng
Đồ thị có hướng G là một cặp có thứ tự G:=(V, A), trong đó



V, tập các đỉnh hoặc nút,
A, tập các cặp có thứ tự chứa các đỉnh, được gọi là các cạnh có
hướng hoặc cung. Một cạnh e = (x, y) được coi là có hướng từ x tới y; x được
gọi là điểm đầu/gốc và y được gọi là điểm cuối/ngọn của cạnh.

Hình 2.2.2: Đồ thị vơ hướng
2.3.3 Đơn đồ thị và đa đồ thị
- Đơn đồ thị là đồ thị mà khơng có khun và khơng có cạnh song song.
- Đa đồ thị là đồ thị mà khơng thỏa mãn đơn đồ thị.
- Đa đồ thị có hướng là một đồ thị có hướng, trong đó, nếu x và y là hai đỉnh
thì đồ thị được phép có cả hai cung (x, y) và (y, x).


12


- Đơn đồ thị có hướng (hoặc Đơn đồ thị có hướng) là một đồ thị có hướng,
trong đó, nếu x và y là hai đỉnh thì đồ thị chỉ được phép có tối đa một trong
hai cung (x, y) hoặc (y, x).
- Quiver thường được coi là một đồ thị có hướng. Nhưng trong thực hành, nó
là một đồ thị có hướng với các khơng gian vector (vector space) gắn với các
đỉnh và các biến đổi tuyến tính gắn với các cung.

2.4 Cấu trúc dữ liệu đồ thị
Có nhiều cách khác nhau để lưu trữ các đồ thị trong máy tính. Sử dụng cấu
trúc dữ liệu nào thì tùy theo cấu trúc của đồ thị và thuật toán dùng để thao tác trên
đồ thị đó. Trên lý thuyết, người ta có thể phân biệt giữa các cấu trúc danh sách và
các cấu trúc ma trận. Tuy nhiên, trong các ứng dụng cụ thể, cấu trúc tốt nhất
thường là kết hợp của cả hai. Người ta hay dùng các cấu trúc danh sách cho các đồ
thị thưa (sparse graph), do chúng địi hỏi ít bộ nhớ. Trong khi đó, các cấu trúc ma
trận cho phép truy nhập dữ liệu nhanh hơn, nhưng lại cần lượng bộ nhớ lớn nếu đồ
thị có kích thước lớn.
2.4.1 Các cấu trúc danh sách
Danh sách liên thuộc (Incidence list) - Mỗi đỉnh có một danh sách các
cạnh nối với đỉnh đó. Các cạnh của đồ thị được có thể được lưu trong một danh
sách riêng (có thể cài đặt bằng mảng (array) hoặc danh sách liên kết
động (linked list)), trong đó mỗi phần tử ghi thông tin về một cạnh, bao gồm:
cặp đỉnh mà cạnh đó nối (cặp này sẽ có thứ tự nếu đồ thị có hướng), trọng số và
các dữ liệu khác. Danh sách liên thuộc của mỗi đỉnh sẽ chiếu tới vị trí của các
cạnh tương ứng tại danh sách cạnh này.
Danh sách kề (Adjacency list) - Mỗi đỉnh của đồ thị có một danh sách
các đỉnh kề nó (nghĩa là có một cạnh nối từ đỉnh này đến mỗi đỉnh đó). Trong

đồ thị vơ hướng, cấu trúc này có thể gây trùng lặp. Chẳng hạn nếu đỉnh 3 nằm
trong danh sách của đỉnh 2 thì đỉnh 2 cũng phải có trong danh sách của đỉnh 3.
Lập trình viên có thể chọn cách sử dụng phần khơng gian thừa, hoặc có thể liệt
kê các quan hệ kề cạnh chỉ một lần. Biểu diễn dữ liệu này thuận lợi cho việc từ
một đỉnh duy nhất tìm mọi đỉnh được nối với nó, do các đỉnh này đã được liệt
kê tường minh.
2.4.2 Cấu trúc ma trận
2.4.2.1 Ma trận liên thuộc

13


Ma trận liên thuộc (Incidence matrix) - Đồ thị được biểu diễn bằng một ma trận b[ij]
kích thước p × q, trong đó p là số đỉnh và q là số cạnh, b[ij] chứa dữ liệu về quan hệ giữa
đỉnh V[i] và cạnh B[j] . Đơn giản nhất: bij = 1 nếu đỉnh v[i] là một trong 2 đầu của cạnh x[j],
bằng 0 trong các trường hợp khác.

Hình 2.4.1: biểu diễn ma trận có hướng

—Nếu G là đồ thị có hướng khơng có khun, ma trận liên thuộc (hay liên kết đỉnh
cạnh) của đồ thị G, ký hiệu A(G), là ma trận n*m (n: số đỉnh, m: số cạnh) được
định nghĩa là A = (Aij) với quy ước:
* Aij = 1 nếu cạnh j hướng ra khỏi đỉnh i
* Aij = -1 nếu cạnh j hướng vào đỉnh i.
* Aij = 0 nếu cạnh j khơng kề đỉnh i.

Hình 2.4.2 : Biểu diễn đồ thị vô hướng ma trận

—Nếu G là đồ thị vơ hướng khơng có khun, ma trận liên thuộc (hay liên kết đỉnh
cạnh) của đồ thị G, ký hiệu A(G), là ma trận n*m (n: số đỉnh, m: số cạnh) được

định nghĩa là A = (Aij) với quy ước:
* Aij = 1 nếu đỉnh i kề với cạnh j.

14


* Aij = 0 nếu ngược lại.

2.4.2.2 Ma trận kề
Ma trận kề (Adjaceny matrix) - một ma trận N × N, trong đó N là số đỉnh của đồ thị. Nếu
có một cạnh nào đó nối đỉnh v[i] với đỉnh v[j] thì phần tử m[ij] bằng 1, nếu khơng, nó có giá trị
0. Cấu trúc này tạo thuận lợi cho việc tìm các đồ thị con và để đảo các đồ thị.

Hình 2.4.3 Đồ thị vơ hướng biểu diễn ma trận

15


Hình 2.4.4 : Kết quả biểu diên sang ma trận kề

16


Hình 2.4.5 Đị thị G

17


Hình 2.4.6 Kết quả biểu diên đồ thị G sang ma trận kề
2.4.2.2.1 Ưu điểm


Khi được sử dụng với vai trị cấu trúc dữ liệu, đối thủ chính của ma trận kề
là danh sách kề. Do mỗi ô trong ma trận kề chỉ địi hỏi một bit, nên chúng có thể
được biểu diễn bằng một cách rất gọn, chỉ chiếm n2/8 byte bộ nhớ liên tục, trong
đó n là số đỉnh. Ngoài việc tiết kiệm bộ nhớ, lưu trữ gọn gàng này cịn khuyến
khích locality of reference (tính địa phương của các truy nhập đến bộ nhớ).
Mặt khác, khi dùng cho đồ thị thưa, danh sách kề lại thắng thế, do chúng
không lưu trữ các cạnh không tồn tại. Sử dụng cài đặt danh sách liên kết đơn giản
trên một máy tính 32-bit, một danh sách kề cho một đồ thị vơ hướng cần khoảng
16e byte, trong đó e là số cạnh của đồ thị.
Lưu ý rằng một đồ thị có thể có nhiều nhất n2 cạnh (kể cả các khuyên). Giả
sử d = e/n2 ký hiệu mật độ của đồ thị. Ta có: 16e > n2/8, có nghĩa là danh sách kề
chiếm nhiều không gian hơn khi d > 1/128. Do đó, chỉ nên dùng danh sách kề với
đồ thị thưa.
Bên cạnh thỏa hiệp về không gian bộ nhớ, các cấu trúc dữ liệu khác nhau
còn tạo thuận lợi cho các thao tác dữ liệu khác nhau. Với một danh sách kề, ta dễ
dàng tìm mọi đỉnh kề với một đỉnh cho trước; ta chỉ cần đọc danh sách kề của đỉnh
đó. Với một ma trận kề, ta phải duyệt tồn bộ một hàng, việc đó cần thời gian O(n).
Còn nếu ta lại muốn biết giữa hai đỉnh cho trước có cạnh nối hay khơng, điều này
có thể được xác định ngay lập tức với một ma trận kề, trong khi đó với một danh
sách kề, việc này địi hỏi thời gian tỷ lệ thuận với bậc nhỏ nhất của các đỉnh trong
đồ thị

18


2.4.2.3 Ma trận dân nạp
Ma trận dẫn nạp (Admittance matrix) hoặc ma trận
Kirchhoff (Kirchhoff matrix) hay ma trận Laplace (Laplacian matrix) được định nghĩa là kết quả thu được khi lấy ma trận bậc (degree matrix) trừ
đi ma trận kề. Do đó, ma trận này chứa thơng tin cả về quan hệ kề (có cạnh

nối hay khơng) giữa các đỉnh lẫn bậc của các đỉnh đó.
Dưới đây là một ví dụ đơn giản về một đồ thị có nhãn, vơ hướng và ma
trận Laplace của nó.

Hình 2.4.7 Đồ thị nhãn và minh họa

2.5 Đánh giá độ phức tạp của thuật toán và lựa chọn
Trong khi giải một bài toán chúng ta có thể có một số giải thuật khác nhau,
vấn đề là cần phải đánh giá các giải thuật đó để lựa chọn một giải thuật tốt (nhất).
Thơng thường thì ta sẽ căn cứ vào các tiêu chuẩn sau:
1. Giải thuật đúng đắn.
2. Giải thuật đơn giản.
3. Giải thuật thực hiện nhanh.
Với yêu cầu (1), để kiểm tra tính đúng đắn của giải thuật chúng ta có thể cài đặt
giải thuật đó và cho thực hiện trên máy với một số bộ dữ liệu mẫu rồi lấy kết quả
thu được so sánh với kết quả đã biết. Thực ra thì cách làm này khơng chắc chắn bởi
vì có thể giải thuật đúng với tất cả các bộ dữ liệu chúng ta đã thử nhưng lại sai với
một bộ dữ liệu nào đó. Vả lại cách làm này chỉ phát hiện ra giải thuật sai chứ chưa
chứng minh được là nó đúng. Tính đúng đắn của giải thuật cần phải được chứng
minh bằng tốn học. Tất nhiên điều này khơng đơn giản và do vậy chúng ta sẽ
không đề cập đến ở đây.
Khi chúng ta viết một chương trình để sử dụng một vài lần thì y ê u cầu (2)
là quan trọng nhất. Chúng ta cần một giải thuật dễ viết chương trình để nhanh
19


chóng có được kết quả, thời gian thực hiện chương trình khơng được đề cao vì dù
sao thì chương trình đó cũng chỉ sử dụng một vài lần mà thơi.
Tuy nhiên khi một chương trình được sử dụng nhiều lần thì thì yêu cầu tiết kiệm
thời gian thực hiện chương trình lại rất quan trọng đặc biệt đối với những chương

trình mà khi thực hiện cần dữ liệu nhập lớn do đó yêu cầu (3) sẽ được xem xét một
cách kĩ càng. Ta gọi nó là hiệu quả thời gian thực hiện của giải thuật
Độ phức tạp thuật toán Thời gian mà máy tính khi thực hiện một thuật
tốn khơng chỉ phụ thuộc vào bản thân thuật tốn đó, ngồi ra cịn tùy thuộc từng
máy tính. Để đánh giá hiệu quả của một thuật tốn, có thể xét số các phép tính phải
thực hiện khi thực hiện thuật tốn này. Thơng thường số các phép tính được thực
hiện phụ thuộc vào cỡ của bài toán, tức là độ lớn của đầu vào. Vì thế độ phức tạp
thuật tốn là một hàm phụ thuộc đầu vào. Tuy nhiên trong những ứng dụng thực
tiễn, chúng ta khơng cần biết chính xác hàm này mà chỉ cần biết một ước lượng đủ
tốt của chúng.
Để ước lượng độ phức tạp của một thuật toán ta thường dùng khái niệm bậc
O-big và bậc Θ (bậc Theta).
Gọi n là độ lớn đầu vào. Tùy thuộc từng bài tốn mà n có thể nhận những giá
trị khác nhau. Chẳng hạn, bài tốn tính giai thừa thì n chính là số cần tính giai thừa.
Nhiều bài tốn số trị, chẳng hạn tính sai phân thì n là số chữ số có nghĩa cần đạt
được. Trong các phép tính đối với ma trận thì n là số hàng hoặc cột của ma trận.
Độ phức tạp của bài toán phụ thuộc vào n. Ở đây ta không chỉ đặc trưng độ
phức tạp bởi số lượng phép tính, mà dùng một đại lượng tổng quát là tài nguyên
cần dùng R(n) . Đó có thể là số lượng phép tính (có thể tính cả số lần truy nhập bộ
nhớ, hoặc ghi vào bộ nhớ); nhưng cũng có thể là thời gian thực hiện chương trình
(độ phức tạp về thời gian) hoặc dung lượng bộ nhớ cần phải cấp để chạy chương
trình (độ phức tạp về không gian).
Xét quan hệ giữa tài nguyên và độ lớn đầu vào, nếu như tìm được hằng số
, n không phụ thuộc vào n, sao cho với n đủ lớn, các hàm R(n),g(n) đều
dương và
thì ta nói thuật tốn có độ phức tạp cỡ O(g(n)).
Nói ngắn gọn thì, mỗi một bài tốn có giới hạn/kích thước của đầu vào. Độ phức
tạp thuật toán là 1 khái niệm/định nghĩa/định lượng tương đối thể hiện số phép
toán của giải thuật so với kích thước của đầu vào.


20


Chương 3: Các giải thuật đồ thị

3.1 Các giải thuật về tô màu đồ thị
3.1.1 Các khái niệm cơ bản
Bài tốn tơ màu đồ thị là gán màu cho các phần tử nhất định của đồ thị theo
những ràng buộc nhất định.
Tô màu đỉnh là vấn đề tô màu đồ thị phổ biến nhất. Bài toán là, cho trước
m màu, hãy tìm cách tơ màu các đỉnh của đồ thị sao cho khơng có hai đỉnh kề
nhau nào được tơ cùng màu. Các bài tốn tơ màu đồ thị khác như Tơ màu
cạnh (Khơng có đỉnh nào trùng với hai cạnh cùng màu) và Tô màu khuôn
mặt (Tô màu bản đồ địa lý) có thể được chuyển thành tơ màu đỉnh.
Số màu: Số màu nhỏ nhất cần thiết để tô màu một đồ thị G được gọi là số màu
của nó. Ví dụ, sau đây có thể được tơ màu tối thiểu 2 màu. Khơng có 2 đỉnh kề
nhau nào có cùng màu

21


3.1.2 Ứng dụng của tơ màu đồ thị

Bài tốn tơ màu đồ thị có số lượng ứng dụng rất lớn. Bài tốn tơ màu đồ
thị thường được ứng dụng để giải quyết vấn đề tô màu (các nước) trên bản đồ, sắp
xếp lịch thi - phịng thi.
1) Lập lịch trình hoặc bảng thời gian: Giả sử chúng ta muốn lập lịch thi sáng
cho một trường đại học. Chúng tơi có danh sách các môn học khác nhau và học
sinh ghi danh vào mọi mơn học. Nhiều mơn học sẽ có sinh viên phổ thông (cùng
lứa, một số sinh viên tồn đọng, v.v.). Làm thế nào để chúng tôi sắp xếp lịch thi để

khơng có hai kỳ thi với một học sinh chung được lên lịch cùng một lúc? Cần bao
nhiêu khoảng thời gian tối thiểu để lên lịch cho tất cả các kỳ thi? Bài tốn này có
thể được biểu diễn dưới dạng đồ thị trong đó mọi đỉnh là một đối tượng và một
cạnh giữa hai đỉnh có nghĩa là có một sinh viên chung. Vì vậy, đây là một bài
tốn tơ màu đồ thị trong đó số khe thời gian tối thiểu bằng số màu của đồ thị.
2) Chỉ định tần số vô tuyến điện thoại di động: Khi các tần số được gán cho các
tháp, các tần số được gán cho tất cả các tháp ở cùng một vị trí phải khác
22


nhau. Làm thế nào để gán tần số với ràng buộc này? Số tần số tối thiểu cần thiết
là bao nhiêu? Bài tốn này cũng là một ví dụ của bài tốn tơ màu đồ thị trong đó
mỗi tháp đại diện cho một đỉnh và một cạnh giữa hai tháp biểu thị rằng chúng
nằm trong phạm vi của nhau.
3) Sudoku: Sudoku cũng là một biến thể của bài tốn tơ màu Đồ thị trong đó mỗi
ơ biểu thị một đỉnh. Có một cạnh giữa hai đỉnh nếu chúng nằm trong cùng một
hàng hoặc cùng một cột hoặc cùng một khối.
4) Phân bổ thanh ghi: Trong tối ưu hóa trình biên dịch, cấp phát thanh ghi là quá
trình gán một số lượng lớn các biến chương trình mục tiêu vào một số lượng nhỏ
các thanh ghi CPU. Bài toán này cũng là một bài tốn tơ màu đồ thị.
5) Đồ thị Bipartite: Chúng ta có thể kiểm tra xem một đồ thị có phải là Bipartite
hay khơng bằng cách tơ màu đồ thị bằng cách sử dụng hai màu. Nếu một đồ thị
nhất định có thể có 2 màu, thì nó là Bipartite, ngược lại thì khơng
6) Tơ màu bản đồ: Bản đồ địa lý của các quốc gia hoặc tiểu bang khơng có hai
thành phố liền kề khơng thể được gán cùng một màu. Bốn màu là đủ để tô màu
cho bất kỳ bản đồ nào
7)Akamai điều hành một mạng lưới hàng nghìn máy chủ và các máy chủ được sử
dụng để phân phối nội dung trên Internet. Họ cài đặt một phần mềm mới hoặc cập
nhật phần mềm hiện có khá nhiều mỗi tuần. Bản cập nhật khơng thể được triển
khai trên mọi máy chủ cùng một lúc, vì máy chủ có thể phải được gỡ xuống để

cài đặt. Ngồi ra, khơng nên thực hiện cập nhật lần lượt vì sẽ mất rất nhiều thời
gian. Có những bộ máy chủ khơng thể được gỡ xuống cùng nhau, bởi vì chúng có
một số chức năng quan trọng. Đây là một ứng dụng lập lịch biểu điển hình của
bài tốn tơ màu đồ thị. Nó chỉ ra rằng 8 màu đủ tốt để tơ màu cho biểu đồ của
75000 nút. Vì vậy, họ có thể cài đặt các bản cập nhật trong 8 lần.

3.1.3 Giải thuật
3.1.3.1Bài tốn
Bước 1: Tính giá trị bậc của các đỉnh trong V. Lập danh sách
V’:=[v1tv2, ...,vn] là các đỉnh của đồ thị được sắp xếp theo thứ tự bậc giảm dần:
d(v1) > d(v2) > ... > d(vn). Ban đầu tất cả các đỉnh trong V (V’) đều chưa được tô
màu.
Gán i := 1;
23


Bước 2: Tô màu i cho đỉnh đầu tiên trong danh sách V’. Duyệt lần lượt các
đỉnh khác trong V’(nếu có) và chỉ tơ màu i cho các đỉnh khơng kề đỉnh đã có màu
i.
Bước 3: Kiểm tra nếu tất cả các đỉnh trong V đã được tơ màu thì thuật toán
kết thúc, đồ thị đã sử dụng i màu để tơ. Ngược lại, nếu vẫn cịn đỉnh chưa được tơ
thì chuyển sang bước 4.
Bước 4: Loại khỏi danh sách V’ các đỉnh đã tô màu. Sắp xếp lại các đỉnh
trong V’ theo thứ tự bậc giảm dần. Gán i := i + 1 và quay lại bước 2.
3.1.3.2 Ví dụ
Bước 1: Ta có đồ thị có 5 đỉnh được đánh số 1, 2, 3, 4, 5 với các bậc tương ứng
với từng đỉnh theo thứ tự là 3, 1, 2, 1, 3. Do đó V’ ban đầu có thứ tự là [1, 5, 3, 2,
4]. Gán i =1.
Bước 2: Tô màu 1 (red) cho đỉnh 1. Lần lượt duyệt các đỉnh cịn lại trong V’:
Ta có: Đỉnh 5 kề đỉnh 1 (đỉnh 1 đã tô màu 1 - red) nên chưa tô màu cho đỉnh 5.

Tương tự các đỉnh 3, 2 đều kề với đỉnh 1 nên đỉnh 3, 2 cũng chưa được tô màu.
Đỉnh 4 không kề với đỉnh 1, do đó thực hiện tơ màu 1 cho đỉnh 4. Đỉnh 4 có
màu 1 - red.
Bước 3: Kiểm tra thấy vẫn còn các đỉnh trong V chưa được tô màu nên
chuyển sang bước 4.
Bước 4: Loại bỏ các đỉnh 1, 4 đã được tô màu ra khỏi V’, sắp xếp lại V’ theo
thứ tự bậc giảm dần, ta thu được V’= [5, 3, 2]. Ta có i = 2. Thực hiện lặp lại bước
2:
Bước 2(1): Tô màu 2 (blue) cho đỉnh 5. Lần lượt duyệt các đỉnh còn lại trong
V’. Ta có: Đỉnh 3 kề đỉnh 5 (đã tô màu 2 - blue) nên chưa tô màu cho đỉnh 3.
Đỉnh 2 khơng kề với đỉnh 5, do đó thực hiện tô màu 2 cho đỉnh 2. Đỉnh 2 có
màu 2 - blue.
Bước 3(1): Kiểm tra thấy vẫn cịn đỉnh 3 chưa được tô màu nên chuyển sang
bước 4.
Bước 4(1): Loại bỏ các đỉnh 5, 2 đã được tô màu ra khỏi V’, V’=[3]. Ta có i =
3. Thực hiện lặp lại bước 2:
Bước 2(2): Tô màu 3 (Green) cho đỉnh 3.
Bước 3(2): Kiểm tra thấy tất cả các đỉnh trong V đã được tơ màu, thuật tốn
dừng lại. Kết luận: Đỉnh 1 và 4 được tô màu 1-red, đỉnh 5 và đỉnh 2 được tô màu 2blue, đỉnh 3 được tô màu 3-Green. Số màu cần thiết phải sử dụng là i =3 màu.

24


3.1.3.3 Giải thuật tham lam tơ màu đồ thị
Thuật tốn tô màu tham lam cơ bản:

1. Tô màu đỉnh đầu tiên với màu đầu tiên.
2. Thực hiện sau cho các đỉnh V-1 còn lại.
… .. a) Xem xét đỉnh hiện đang được chọn và tơ màu nó với
màu được đánh số thấp nhất chưa được sử dụng trên bất kỳ

đỉnh đã tơ màu nào trước đó liền kề với nó. Nếu tất cả các màu đã sử dụng trước
đó
xuất hiện trên các đỉnh liền kề với v, hãy gán một màu mới cho nó .
Minh họa giải thuật tham lam bằng ngôn ngữ java
import java.io.*;
import java.util.*;
import java.util.LinkedList;
//Tạo lớp chứa đồ thị sử dụng danh sách kề
class Graph
{
private int V; // Số đỉnh
private LinkedList<Integer> adj[]; //danh sách kề
//Constructor
25


×