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

Đồ án tốt nghiệp Công nghệ thông tin Xây dựng bài toán ghép đôi không trọng số

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 (388.51 KB, 43 trang )

ĐẠI HỌC
KHOA CÔNG NGHỆ THÔNG TIN
----------

ĐỒ ÁN

TỐT NGHIỆP ĐẠI HỌC

TÊN ĐỀ TÀI
XÂY DỰNG BÀI TỐN GHÉP ĐƠI KHƠNG TRỌNG SỐ
Họ và tên:
Chun nghành: Cơng nghệ thơng tin
Lớp: cntt
Khố: 2016-2020
Hướng dẫn: Tiến sỹ

Hà Nội, 12/2020

1


LỜI CAM ĐOAN

Em xin cam đoan: Đồ án tốt nghiệp “ Xây dựng bài tốn ghép đơi khơng
trọng số “ này là cơng trình nghiên cứu của cá nhân em, được thực hiện trên cơ
sở nghiên cứu lý thuyết và ứng dụng , dưới sự hướng dẫn khoa học của Tiến sĩ
Phạm Minh Hoàn , Trường Đại học Kinh tế quốc dân .
Em xin chịu trách nhiệm về lời cam đoan này.
Hà Nội, ngày 12 tháng 12 năm 2020
Tác giả


2


LỜI CÁM ƠN

Để hoàn thành bài nghiên cứu này, em xin chân thành cám ơn Trường
Đại học Kinh tế quốc dân, Phịng đào tạo, các thầy, cơ giáo giảng dạy lóp Cơng
nghệ thơng tin 58B đã quan tâm, tạo điều kiện thuận lợi, tận tình giảng dạy và
giúp đỡ em trong thời gian theo học tại trường.
Đặc biêt, em xin bày tỏ lòng biết ơn sâu sắc đến TS. Phạm Minh Hoàn, người
đã dành nhiều thời gian, tam huyết hướng dẫn em trong suốt q trình nghiên
cứu và hồn thành đồ án .
Mặc dù đã cố gắng hết sức hoàn thiện luận văn, tuy nhiên chắc chắn vẫn còn
nhiều thiếu sót, rất mong nhận được sự góp ý quý báu của quý thầy cô và các
bạn.
Xin trân trọng cám ơn !
Hà Nội, ngày 12 tháng 12 năm 2020
Tác giả

3


MỤC LỤC
LỜI NÓI ĐẦU.....................................................................................................................................5
CHƯƠNG 1 : CƠ SỞ LÝ THUYẾT VỀ ĐỒ THỊ VÀ ĐỘ PHỨC TẠP THUẬT TOÁN................8
1.1. Các khái niệm cơ bản...................................................................................................................8
1.1.1. Khái niệm đồ thị.....................................................................................................................8
1.1.2. Các loại đồ thị.........................................................................................................................9
1.1.3. Biểu diễn đồ thị trên máy tính............................................................................................16
1.2. Độ phức tạp tính tốn và tính hiệu quả của thuật tốn..........................................................21

1.2.1. Định nghĩa thuật tốn..........................................................................................................21
1.2.2. Phân tích độ phức tạp của thuật toán...............................................................................22
1.2.3. Tối ưu thuật toán.................................................................................................................24
1.3. Một số thuật tốn tìm kiếm trên đồ thị....................................................................................24
1.3.1. Thuật tốn tìm kiếm theo chiều sâu ( Depth first search )..............................................24
1.3.2. Thuật toán tìm kiếm theo chiều rộng (Breadth first search)..........................................26
CHƯƠNG 2: BÀI TỐN TÌM BỘ GHÉP CỰC ĐẠI TRÊN ĐỒ THỊ VÀ CÁC THUẬT TỐN
.............................................................................................................................................................29
2.1. Đồ thị hai phía.............................................................................................................................29
2.2. Bài tốn ghép cặp khơng trọng số trong đồ thị hai phía........................................................30
2.2.1. Các khái niệm.......................................................................................................................30
2.2.2. Thuật toán đường mở..........................................................................................................32
2.2.3. Độ phức tạp của thuật tốn...............................................................................................33
2.2.4. Cài đặt...................................................................................................................................34
CHƯƠNG 3: ỨNG DỤNG BÀI TỐN GHÉP ĐƠI TRONG THỰC TẾ.....................................40
3.1. Phát biểu bài tốn.......................................................................................................................40
3.2. Kết luận........................................................................................................................................41
TÀI LIỆU THAM KHẢO.................................................................................................................42

4


LỜI NĨI ĐẦU
Ngày nay việc giải quyết các bài tốn lớn cho hệ thống đòi hỏi
sự hợp tác chặt chẽ giữa các chuyên gia trong các lĩnh vực chuyên
môn, như các chuyên gia Toán, Toán ứng dụng và các chuyên gia Tin
học, kỹ sư lập trình. Việc thiết lập được một mơ hình hợp lý, phản ánh
đƣợc bản chất của bài toán thực tế đồng thời khả thi về phương diện
tính tốn ln là điều đáng được quan tâm.
Đặc biệt trong các chun ngành liên quan thì tốn học là chuyên

ngành rất được quan tâm, một trong số đó là Lý thuyết đồ thị. Đồ thị
biểu diễn được rất nhiều cấu trúc, nhiều bài tốn thực tế có thể được
biểu diễn bằng đồ thị. Ví dụ, cấu trúc liên kết của một website có thể
được biểu diễn bằng một đồ thị có hướng như sau: các đỉnh là các
trang web hiện tại có tại website, tồn taị một cạnh có hướng nối từ
trang A tới trang B khi và chỉ khi A có chứa 1 liên kết tới B. Do vậy, sự
phát triển của các thuật toán xử l đồ thị là một trong các mối quan tâm
chính của khoa học máy tính.
Mặc dù Lý thuyết đồ thị đã được khoa học phát triển từ rất lâu
nhưng có nhiều ứng dụng hiện đại , đặc biệt là các thuật toán trên đồ thị
đã có nhiều ứng dụng trong nhiều lĩnh vực khác nhau như : Mạng máy
tính, Lý thuyết mã, Tối ưu hoá, Kinh tế học ...Những ý tưởng cơ bản
của lý thuyết đồ thị được nhà toán học Thụy sỹ Leonhard Euler đưa ra
từ thế kỷ 18. Ông đã dùng lý thuyết đồ thị để giải quyết bài toán cầu
Konigsberg nổi tiếng.
Đồ thị cũng được dùng để giải nhiều bài toán thuộc những lĩnh
vực rất khác nhau như : người ta có thể dùng đồ thị để biểu diễn sự
cạnh tranh của các lồi trong mơi trường sinh thái, dùng đồ thị biểu
5


diễn ai có ảnh hưởng đến ai trong một tổ chức nào đó và cũng có thể
dùng đồ thị để giải các bài tốn như bài tốn tính số các tổ hợp khác
nhau của các chuyến xe giữa hai thành phố trong một mạng giao thơng,
bài tốn đi tham quan tất cả các phố của một thành phố sao cho mỗi
phố đi qua đúng một lần, hay bài tốn tìm số màu cần thiết để tô các
vùng khác nhau của một bản đồ,...Đồ thị với các trọng số được gán cho
các cạnh của nó có thể dùng để giải các bài tốn như bài tốn tìm
đường đi ngắn nhất giữa hai thành phố trong một mạng giao thơng, bài
tốn phân công lao động sao cho tổng lợi nhuận thu được là lớn nhất.

Đặc biệt, nhiều bài toán trong thực tế sử dụng mơ hình đồ thị và các
thuật tốn trên đồ thị được giải quyết rất hiệu quả như: bài tốn điều
hành taxi, bài tốn xếp lớp học theo tín chỉ có thể đưa về mơ hình bài
tốn tìm bộ ghép cực đại trên đồ thị và sử dụng các thuật tốn tương
ứng.
Chính vì đồ thị có thể được sử dụng để giải quyết nhiều bài toán
thuộc nhiều lĩnh vực khác nhau một cách dễ dàng và phổ biến như vậy
nên đồ thị giữ một vai trò hết sức quan trọng trong cuộc sống, đặc biệt
là trong lĩnh vực công nghệ thông tin, dựa vào đồ thị và các thuật tốn
trên đồ thị người ta có thể xây dựng nên các phần mềm hữu ích giải các
bài tốn thực tế một cách nhanh chóng và tối ưu .
Nhận thấy tính thiết thực của vấn đề này và được sự gợi ý của
giảng viên hướng dẫn, tôi đã chọn nội dung nghiên cứu về ―Bài tốn
ghép đơi khơng trọng số trên đồ thị, ứng dụng giải một số bài toán
trong thực tế.” làm đề tài cho luận văn tốt nghiệp của mình . Báo cáo
được bố cục thành 3 chương:
Chương 1: Cơ sở lý thuyết đồ thị và độ phức tạp thuật tốn.
Chương 2 : Bài tốn tìm bộ ghép cực đại trên đồ thị và các thuật toán.
6


Chương 3: Ứng dụng bài tốn ghép đơi trong thực tế .

7


CHƯƠNG 1 : CƠ SỞ LÝ THUYẾT VỀ ĐỒ THỊ VÀ ĐỘ PHỨC TẠP
THUẬT TOÁN
1.1. Các khái niệm cơ bản
1.1.1. Khái niệm đồ thị

- Là một cấu trúc rời rạc gồm các đỉnh và các cạnh nối các đỉnh đó. Được mơ
tả hình thức:
G = (V, E)
V gọi là tập các đỉnh,
E là tập các cạnh,
Có thể coi E là tập các cặp (u, v) với u và v là hai đỉnh của V.
Một số hình ảnh của đồ thị:

Cạnh liên thuộc, đỉnh kề , bậc
Đối với đồ thị vô hướng G = (V, E) . Xét một cạnh e ϵ E, nếu e = (u,v) thì ta
nói hai đỉnh u và v là kề nhau và cạnh e này liên thuộc với đỉnh u và đỉnh v.
Với một đỉnh v trong đồ thị, ta định nghĩa bậc của v , ký hiệu deg(v) là số
cạnh liên thuộc với v. Dễ thấy rằng trên đơn đồ thị thì số cạnh liên thuộc với v
cũng là số đỉnh kề với v.

8


Định lý: giả sử G = (V, E) là đồ thị vơ hướng với m cạnh, khi đó tổng tất cả các
bậc đỉnh trong V sẽ bằng 2m:
Đối với đồ thị có hướng G = (V, E). Xét một cung e ϵ E, nếu e = (u, v) thì ta
nói u nối tới v và v nối từ u, cung e là đi ra khỏi đỉnh u và đi vào đỉnh v. Đỉnh u
khi đó được gọi là đỉnh đầu, đỉnh v được gọi là đỉnh cuối của cung e.
Với mỗi đỉnh v trong đồ thị có hướng, ta định nghĩa : Bán bậc ra của v ký
hiệu deg+(v) là số cung đi ra khỏi nó; bán bậc vào ký hiệu deg(-v) là số cung đi
vào đỉnh đó.
Định lý: giả sử G = (V, E) là đồ thị có hướng với m cung, khi đó tổng tất cả các
bán bậc ra của các đỉnh bằng tổng tất cả các bán bậc vào và bằng m:
=m


1.1.2. Các loại đồ thị
Có thể phân loại đồ thị theo đặc tính và số lượng của tập các cạnh E:
Cho đồ thị G = (V, E).
Định nghĩa 1:
Một đơn đồ thị vô hƣớng là một bộ G = <V,E>, trong đó:
- V ≠ Ø là tập hợp hữu hạn gồm các đỉnh của đồ thị.
- E là tập hợp các cặp khơng có thứ tự gồm hai phần tử khác nhau
của V gọi là các cạnh.
Như vậy, theo định nghĩa trên, trong một đơn đồ thị khơng thể có
các cặp cạnh nối cùng một cặp đỉnh (do E là tập hợp nên khơng thể có
2 cặp trùng nhau), các cạnh đều không phân biệt thứ tự nên cạnh [u,v]
và cạnh [v,u] đều được coi là một cạnh duy nhất, điều này phù hợp với
việc biểu diễn các con đường 2 chiều, và hiển nhiên là khơng có cặp
[u,u] nào đó trong E.
9


Ví dụ

a) Đơn đồ thị vơ hướng

b) Khơng phải đơn đồ c) Không phải đơn đồ thị vô
thị vô hướng do có các hướng do có cạnh nối một
cặp cạnh nối cùng một đỉnh với chính nó.
cặp đỉnh

Tuy nhiên, trên thực tế, cũng có thể trong một hệ thống giao
thơng vẫn tồn tại nhiều con đường đi nối cùng hai địa điểm, hoặc cũng
có thể có một con đường để đi từ một địa điểm nào đó rồi lại quay về
chính nó (đây có thể là một con đường nội bộ của một trung tâm mua

sắm, …). Khi đó, tính chất của đơn đồ thị vô hướng nhất định nghĩa
trên không cho phép n biểu diễn được hệ thống giao thông trong
trường hợp này. Muốn vậy, ta phải dùng một loại đồ thị tổng quát hơn,
đó là: đa đồ thị vô hướng.
Định nghĩa 2:
Đa đồ thị vô hướng là một bộ G = <V,E>, trong đó
-

V ≠ Ø là tập hợp hữu hạn gồm các đỉnh của đồ thị.

-

E là một họ các cặp khơng có thứ tự của V gọi là các

-

Khi ta nói E là một họ nghĩa là nó có thể có những

cạnh.
Lưu ý:

cặp trùng nhau (khác với khái niệm tập hợp).
10


Các cạnh nối cùng một cặp đỉnh được gọi là các cạnh
song song.
khuyên.

Các cạnh nối từ một đỉnh với chính nó được gọi là

Ví dụ

e1
e2

a) Đa đồ thị vơ hướng: e1 và e2 là

e

b) Đa đồ thị vô hướng: e là khuyên

các cạnh song song
Điểm chung của hai loại đồ thị đã được định nghĩa ở trên là tính
chất vơ hướng (hai chiều) của các cạnh. Trong thực tế, cũng có khi ta
phải chú trọng đến tính có hướng của các cạnh nối này (chẳng hạn như
biểu diễn các con đường một chiều). Từ đó, ta có thêm loại đồ thị: Đơn
đồ thị có hướng và đa đồ thị có hướng. Về cơ bản, hai loại này cũng
tương tự như hai loại mà ta định nghĩa ở trên, chỉ thêm sự khác biệt là
tính chất có thứ tự của các cạnh.
Định nghĩa 3:
Đơn đồ thị có hướng là một bộ G = <V,E>, trong đó:
- V ≠ Ø là tập hợp hữu hạn gồm các đỉnh của đồ thị.
- E là tập hợp các cặp có thứ tự gồm hai phần tử khác nhau
của V gọi là các cung.

11


a) Đơn đồ thị có


b) Khơng phải đơn đồ thị c) Khơng phải đơn đồ thị có

hướng

có hướng do các các cặp

hướng do có cung

nối một cung nối cùng một cặp

đỉnh với

chính nó.
đỉnh.

Định nghĩa 4:
Đa đồ thị có hướng là một bộ G = <V, E>, trong đó
- V ≠ là tập hợp hữu hạn gồm các đỉnh của đồ thị.
- E là một họ các cặp cạnh thứ tự của V gọi là các cung.
Các cung nối cùng một cặp đỉnh được gọi là các cung song song.
Ví dụ

e1
e

e2

a) Đa đồ thị có hướng: e1 và e2 là các
là cung song song.


b) Đa đồ thị có hướng: e
khuyên .

Định nghĩa 5:

12


Một giả đồ thị G = (V, E) gồm một tập các đỉnh V, một tập các cạnh
E và một hàm f từ E tới {{u,v} | u,v V}. Một c nh là một khuyên nếu
f(e) =
{u} với một đỉnh u nào đó.
Một số thuật ngữ cơ bản

+ Cho đồ thị vô hướng G = <V,E>.
-

Hai đỉnh u và v của đồ thị được gọi là kề nhau nếu (u,v) là một

cạnh của đồ thị.
-

Nếu e = (u,v) là cạnh của đồ thị thì ta nói cạnh này là liên

thuộc với hai đỉnh u và v. Cạnh được nói là nối đỉnh u và v. Đỉnh u và v
được gọi là đỉnh đầu của cạnh e.
+ Cho đồ thị vô hướng G = <V,E>. Bậc của đỉnh v trong đồ thị, kí hiệu
là deg(v), là số cạnh liên thuộc với n. Đỉnh có bậc 0 được gọi là đỉnh cơ
lập, đỉnh có bậc 1 gọi là đỉnh treo.
Ví dụ

Cho đồ thị vơ hướng G = <V,E> sau:

1

2

3

4

5

6

Hình 6: Đơn đồ thị vô hướng

- V = {1, 2, 3, 4, 5, 6}
- E = {(1,2), (2,3), (1,4), (1,5), (2,5), (4,5), (2,4)}

13


- Bậc của các đỉnh:
- deg(1) = 3 deg(2) = 4 deg(3) = 1
- deg(4) = 3 deg(5) = 3 deg(6) = 0
- Đỉnh 3 là đỉnh treo
- Đỉnh 6 là đỉnh cô lập
+ Cho G = <V,E> là đồ thị vơ hướng. Khi đó ta có tổng số bậc của các
đỉnh của đồ thị sẽ bằng hai lần số cạnh của n. Nói cách khác, ta có:
∑deg (v) =2|E|

vV
-Trong đồ thị vô hƣớng, số đỉnh bậc lẻ là một
số chẵn.
+ Cho đồ thị có hướng G = <V,E>.
- Hai đỉnh u và v của đồ thị được gọi là kề nhau nếu (u,v) là
một cung của đồ thị.
- Nếu e=(u,v) là cung của đồ thị thì ta nói cung này đi ra khỏi
đỉnh u và đi vào đỉnh v. Đỉnh u được gọi là đỉnh đầu của cung e và
đỉnh v được gọi là đỉnh cuối của cung e.
+ Cho đồ thị có hướng G=<V,E>.
- Bán bậc ra của đỉnh v trong đồ thị, ký hiệu là deg +(v), là số
cạnh đi ra khỏi v.
- Bán bậc vào của đỉnh v trong đồ thị, ký hiệu là deg - (v), là
số cạnh vào v.

14


Ví dụ
Xét đồ thị có hướng G = <V,E> sau:
1

2

4

5

3


6

Hình 7: Đồ thị có hướng

- V = {1, 2, 3, 4, 5, 6}
- E = {(1,2), (2,3), (1,4), (5,1), (5,2), (2,6), (6,3), (4,5), (6,5),
(3,4)}
- Bậc của các đỉnh:
- Bán bậc ra: deg+(1)=2
deg+(4)=1

deg+(2)=2 deg+(3)=1

deg+(5)=2 deg+(6)=2

- Bán bậc vào: deg-(1)=1 deg-(2)=2 deg-(3)=2
deg-(4)=2 deg-(1)=2 deg-(1)=1
Tương tự như đồ thị vô hướng, đối với đồ thị có hướng ta cũng
có kết quả gần tương tự về bậc của các đỉnh của đồ thị.
+ Cho G = <V,E> là đồ thị có hướng. Tổng bán bậc ra của các đỉnh
bằng tổng bán bậc vào của các đỉnh và bằng số cạnh của đồ thị.
∑deg+(v)=deg-(v)=|E|
vV
vV
15


+ Đồ thị vô hướng G = <V,E> được gọi là liên thơng nếu ln tìm
được đường đi giữa hai đỉnh bất kỳ của n .


1.1.3. Biểu diễn đồ thị trên máy tính
Lý thuyết đồ thị được ứng dụng trong rất nhiều lĩnh vực khác
nhau. Để sử dụng được đồ thị hiệu quả và nhanh chóng hơn, chúng ta
phải biểu diễn và xử lý được đồ thị với máy tính. Cách biểu diễn thơng
thường bằng hình vẽ và mơ tả tập hợp sẽ không phải hợp với cách thức
lưu trữ dữ liệu và xử lý trên máy tính. Chúng ta phải tìm một cấu trúc
dữ liệu thích hợp để biểu diễn đồ thị trên máy tính.
Có nhiều phương pháp khác nhau để biểu diễn đồ thị trên máy tính.
Sau đây chúng ta sẽ lần lượt tìm hiểu một số phương pháp thông dụng.

1.1.3.1. Danh sách cạnh
Trong trường hợp đồ thị có n đỉnh, m cạnh, ta có thể biểu diễn đồ thị
dưới dạng danh sách cạnh, trong cách biểu diễn này, ngƣời ta liệt kê tất
cả các cạnh của đồ thị trong một danh sách, mỗi phần tử của danh sách
là một cặp (u, v) tương ứng với một cạnh của đồ thị. (Trong trường hợp
đồ thị có hướng thì mỗi cặp (u, v) tương ứng với một cung, u là đỉnh
đầu và v là đỉnh cuối của cung). Danh sách được lưu trong bộ nhớ dưới
dạng mảng hoặc danh sách móc nối.
Ví dụ với đồ thị dưới đây:

16


1
5

2

4


3

Cài đặt trên mảng:
1

2

3

4

5

(1,3)

(2,4)

(3,5)

(4,1)

(5,2)

Cài đặt trên danh sách m c nối:
1

3

2


4

5

3

2

5

4

1

nil
Ví dụ biểu diễn đồ thị danh sách cạnh
Ưu điểm của danh sách cạnh:
• Trong trường hợp đồ thị thưa (có số cạnh tương đối nhỏ: chẳng hạn
m < 6n), cách biểu diễn bằng danh sách cạnh sẽ tiết kiệm được khơng
gian lưu trữ, bởi nó chỉ cần 2m ơ nhớ để lưu danh sách cạnh.


Trong một số trường hợp, ta phải xét tất cả các cạnh của đồ thị thì

cài đặt trên danh sách cạnh làm cho việc duyệt các cạnh dễ dàng hơn.
(Thuật toán Kruskal chẳng hạn)
Nhược điểm của danh sách cạnh:


Nhược điểm cơ bản của danh sách cạnh là khi ta cần duyệt tất cả


các đỉnh kề với đỉnh v nào đó của đồ thị, thì chẳng có cách nào khác là

17


phải duyệt tất cả các cạnh, lọc ra những cạnh có chứa đỉnh v và xét đỉnh
cịn lại.
Điều đó khá tốn thời gian trong trường hợp đồ thị dày (nhiều cạnh).
1.1.3.2. Danh sách kề
Sử dụng danh sách liền kề để biểu diễn đồ thị khơng có cạnh bội.
Danh sách này chỉ rõ các đỉnh nối với mỗi đỉnh của đồ thị.

1

Đỉnh

5

1
2

2

3
3

Đỉnh liền kề
2, 3,4, 5
1,3, 4, 5


4

1,2,4

4

1,2,3

5

1,2

Ví dụ biểu diễn đồ thị danh sách liền kề
Ưu điểm của danh sách kề:


Đối với danh sách kề, việc duyệt tất cả các đỉnh kề với một đỉnh v

cho trước là hết sức dễ dàng, cái tên "danh sách kề" đã cho thấy rõ điều
này. Việc duyệt tất cả các cạnh cũng đơn giản vì một cạnh thực ra là nối
một đỉnh với một đỉnh khác kề n .
Nhược điểm của danh sách kề


Về lý thuyết, so với hai phương pháp biểu diễn trên, danh sách kề

tốt hơn hẳn. Chỉ có điều, trong trường hợp cụ thể mà ma trận kề hay
danh sách cạnh khơng thể hiện nhược điểm thì ta nên dùng ma trận kề
(hay danh sách cạnh) bởi cài đặt danh sách kề có phần dài dịng hơn.

18


1.1.3.3. Ma trận liền kề
Giả sử G = (V, E) là một đồ thị đơn trong đó |V| = n và các đỉnh
được liệt kê tuỳ

v1,…,vn. Ma trận liền kề A của G ứng với danh sách

các đỉnh này là ma trận khơng - một cấp n*n có phần tử hàng i, cột j
bằng 1 nếu vi và vj liền kề nhau, và bằng 0 nếu chúng không được nối
với nhau.
1
5

1
2

4
3

1

2

0

1

1


1

1

2

1

0

1

1

1

3

1

1

0

1

0

4


1

1

1

0

0

5

1

1

0

0

0

4

5

Hình 10: Ví dụ biểu diễn đồ thị ma trận kề
Các tính chất của ma trận liền kề:
1. Đối với đồ thị vơ hướng G, thì ma trận liền kề tương ứng là ma

trận đối xứng (aij = aji), điều này khơng đúng với đồ thị có hướng.
2. Nếu G là đồ thị vô hướng và A là ma trận liền kề tương ứng thì
trên ma trận A:Tổng các số trên hàng i = Tổng các số trên cột i =
Bậc của đỉnh i = deg(i)
3. Nếu G là đồ thị có hướng và A là ma trận liền kề tương ứng thì
trên ma trận A:
19


• Tổng các số trên hàng i = Bán bậc ra của đỉnh i = deg+(i)
• Tổng các số trên cột i = Bán bậc vào của đỉnh i = deg-(i)
Trong trường hợp G là đơn đồ thị, ta có thể biểu diễn ma trận liền kề A
tương ứng là các phần tử logic.Aij = TRUE nếu (i, j) E và aij = FALSE
nếu (i, j) ∉ E
Ưu điểm của ma trận liền kề:
• Đơn giản, trực quan, dễ cài đặt trên máy tính
• Để kiểm tra xem hai đỉnh (u, v) của đồ thị có kề nhau hay
khơng, ta
chỉ việc kiểm tra bằng một phép so sánh: auv ≠ 0.
Nhược điểm của ma trận liền kề:
• Bất kể số cạnh của đồ thị là nhiều hay ít, ma trận liền kề
ln ln địi
hỏi n2 ơ nhớ để lưu các phần tử ma trận, điều đó gây lãng phí bộ nhớ
dẫn tới việc không thể biểu diễn được đồ thị với số đỉnh lớn.
Với một đỉnh u bất kỳ của đồ thị, nhiều khi ta phải xét tất cả các đỉnh v
khác kề với nó, hoặc xét tất cả các cạnh liên thuộc với n . Trên ma trận
liền kề việc đó được thực hiện bằng cách xét tất cả các đỉnh v và kiểm
tra điều kiện auv ≠ 0. Như vậy, ngay cả khi đỉnh u là đỉnh cô lập (không
kề với đỉnh nào) hoặc đỉnh treo (chỉ kề với 1 đỉnh) ta cũng buộc phải
xét tất cả các đỉnh và kiểm tra điều kiện trên dẫn tới lãng phí thời gian.


1.1.3.4. Ma trận liên thuộc

20


Giả sử G = (V, E) là một đồ thị vơ hướng, v1, v2, vn là tập các
đỉnh cịn e1, e2, ..., em là tập các cạnh của nó. Khi đó ma trận liên thuộc
theo thứ tự trên của V và E là ma trận M = [mij] trong đ :
mij = 1 nếu cạnh ej nối với đỉnh vi
mij = 0 nếu cạnh ej không nối với
đỉnh vi

V1

e6
e4

e1

V5

e1 e2

e7
e3

V2

e2


V3

V4

e8

e3

e4

e5

e6

e7

e8

v1 1

0

0

0

1

1


1

0

v2

1

1

1

1

0

0

0

0

v3

0

0

0


1

0

1

0

1

v4

0

0

1

0

0

0

1

1

v5


0

1

0

0

1

0

0

0

Ví dụ biểu diễn đồ thị ma trận liên thuộc

1.2. Độ phức tạp tính tốn và tính hiệu quả của thuật toán
1.2.1. Định nghĩa thuật toán
Thuật toán là một dãy hữu hạn các bước, mỗi bước mơ tả chính
xác các phép toán hoặc hành động cần thực hiện để cho ta lời giải của
bài tốn.
- Thao tác, hay cịn gọi là tác vụ, phép toán ( Operation ) hay
lệnh (Command), chỉ thị (Instruction)...là một hành động cần được thực
hiện bởi cơ chế thực hiện thuật toán.
Mỗi thao tác biến đổi bài toán từ một trạng thái trước (hay trạng
thái nhập) sang trạng thái sau (hay trạng thái xuất).Thực tế mỗi thao tác
thường sử dụng một số đối tượng trong trạng thái nhập (các đối tượng

21


nhập )và sản sinh ra các đối tượng mới trong trạng thái xuất (các đối
tượng xuất). Quan hệ giữa 2 trạng thái xuất và nhập cho thấy tác động
của thao tác. Dãy các thao tác của thuật toán nối tiếp nhau nhằm biến
đổi bài toán từ trạng thái ban đầu đến trạng thái kết quả.
Mỗi thao tác có thể phân tích thành các thao tác đơn giản hơn.
Trình tự thực hiện các thao tác phải được xác định rõ ràng trong thuật
toán. Cùng một tập hợp thao tác nhưng xếp đặt theo trình tự khác nhau
sẽ cho kết quả khác nhau.

1.2.2. Phân tích độ phức tạp của thuật tốn
Trong khi giải một bài tốn 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 người ta căn cứ vào các tiêu chuẩn sau:
-

Tiêu chuẩn về tính đúng đắn của thuật tốn, thuật tốn có

cho lời giải đúng của bài tốn hay khơng ?
-

Tiêu chuẩn về tính đơn giản của thuật tốn. Thường ta mong

muốn có được một thuật tốn đơn giản, dễ hiểu, dễ lập trình. Đặc biệt
là những thuật tốn chỉ dùng một vài lần ta cần coi trọng tính chất này,
vì cơng sức và thời gian bỏ ra để xây dựng thuật toán thường lớn hơn
rất nhiều so với thời gian thực hiện nó.
-


Tiêu chuẩn về thời gian: Thời gian chạy của thuật tốn có

nhanh khơng? Khi một chương trình được sử dụng nhiều lần 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 bài toán mà dữ liệu đầu vào lớn thì tiêu chuẩn này là
rất quan trọng.

22


Trong phần này ta quan tâm chủ yếu đến độ phức tạp thời gian
của thuật tốn.
Các bước trong q trình phân tích đánh giá thời gian chạy của thuật
tốn:
-

Bước đầu tiên trong việc phân tích thời gian chạy của thuật

tốn là quan tâm đến kích thước dữ liệu, sẽ được dùng như dữ liệu nhập
của thuật toán và quyết định phân tích thuật tốn nào là thích hợp. Ta
có thể xem thời gian chạy của thuật toán là một hàm theo kích thước
của dữ liệu nhập. Nếu gọi n là kích thước của dữ liệu nhập thì thời gian
thực hiện T của thuật toán được biểu diễn như một hàm theo n, ký hiệu
là: T(n). Người ta thường coi T(n) là thời gian thực hiện chương trình
trong trường hợp xâu nhất trên dữ liệu vào có kích thước n, tức là: T(n)
là thời gian lớn nhất để thực hiện chương trình đối với mọi dữ liệu vào
có cùng kích thước n.
-


Bước thứ hai trong việc phân tích thời gian chạy của một

thuật toán là nhân ra các thao tác trừu tượng của thuật tốn để tách biệt
sự phân tích và sự cài đặt. Bởi vì ta biết rằng tốc độ xử lý của máy tính
và các bộ dịch của ngơn ngữ lập trình cao cấp đều ảnh hưởng đến thời
gian chạy của thuật tốn, nhưng những thao tác này khơng đồng đều
trên các loại máy trên đó cài đặt thuật tốn, vì vậy khơng thể dựa và
chúng để đánh giá thời gian chạy của thuật toán. Chẳng hạn ta tách biệt
sự xem xét xem có bao nhiêu phép tốn so sánh trong một thuật toán
sắp xếp khỏi sự xác định cần bao nhiêu micro giây chạy trên một máy
tính cụ thể. Yếu tố thứ nhất được xác định bởi tính chất của thuật tốn,
cịn yếu tố thứ hai được xác định bởi tính năng của máy tính. Điều này
cho thấy rằng T(n) không thể được biểu diễn bằng giây, phút … được;
cách tốt nhất là biểu diễn theo số các chỉ thị trong thuật toán.

23


1.2.3. Tối ưu thuật tốn
Tiến trình tổng qt của việc tạo ra các sửa đổi ngày càng tiến bộ
hơn cho một thuật toán để sinh ra một phiên bản khác chạy nhanh hơn
được gọi là tối ưu thuật toán. Khi tối ưu một thuật toán ta thường dựa
vào một nguyên lý, đó là ngun l Profile : ― Tìm điểm mất thời gian
nhiều nhất của thuật toán ―.
Một số kỹ thuật thường dùng để tối ưu thuật toán là:
Kỹ thuật tối ưu các vòng lặp và tối ưu việc rẽ nhánh
Đây là điểm quan tâm đầu tiên khi cải tiến thuật tốn, vì vịng lặp
là câu lệnh thường làm tăng độ phức tạp của thuật toán. Việc cải tiến
tập trung vào:
-


Cố gắng giảm các vòng lặp lồng nhau.

-

Tăng số lệnh thực hiện trong một bước lặp để giảm số

lượng các bước lặp.
-

Tách các lệnh không phụ thuộc vào chỉ số lặp ra khỏi vịng

lặp.

1.3. Một số thuật tốn tìm kiếm trên đồ thị
1.3.1. Thuật tốn tìm kiếm theo chiều sâu ( Depth first search )
procedure DFS(uV);
begin
< 1. Thông báo tới được u >;
< 2. Đánh dấu u là đã thăm (có thể tới được từ S)>;
< 3. Xét mọi đỉnh v kề với u mà chưa thăm, với mỗi đỉnh v đó >;
begin
Trace[v]: = u; {Lưu vết đường đi, đỉnh mà từ đo tới v là
u}

DFS(v);

{Gọi đệ quy duyệt tƣơng tự đối với v}

24



end;
end;
begin {Chương
trình chính}
< Nhập dữ liệu: đồ thị, đỉnh xuất phát S, đỉnh đích F >;
< Khởi tạo: Tất cả các đỉnh đều chưa bị đánh dấu >;
DFS(S);
< Nếu F chưa bị đánh dấu thì khơng thể có đường đi từ S
tới F >; < Nếu F đã bị đánh dấu thì truy theo vết để tìm
đường đi từ S tới F >; end.
Ví dụ: Với đồ thị sau đây, đỉnh xuất phát S = 1: quá trình duyệt đệ quy
có thể vẽ trên cây tìm kiếm DFS sau (Mũi tên u→v chỉ thao tác đệ quy:
DFS(u) gọi DFS(v)).

Quá trình tìm kiếm theo chiều sâu

1.3.2. Thuật tốn tìm kiếm theo chiều rộng (Breadth first search)
25


×