ĐẠ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ố: 20162020
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 Hồ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
Để hồ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 Hồ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 hồ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 ý q báu của q 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
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 chun gia trong các lĩnh vực chun
mơn, như các chun gia Tốn, Tốn ứng dụng và các chun 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 tố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à
chun 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 tố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 tố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 hố, Kinh tế học ...Những ý
tưởng cơ bản của lý thuyết đồ thị được nhà tố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 tốn cầu Konigsberg nổi tiếng.
Đồ thị cũng được dùng để giải nhiều bài tố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ự
5
cạnh tranh của các lồi trong mơi trường sinh thái, dùng đồ thị biểu
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 tố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
tố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
6
một số bài tố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 tốn.
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 TỐ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.
Đị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:
8
Đố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 qt 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
cạnh.
Lưu ý:
Khi ta nói E là một họ nghĩa là nó có thể có những cặp
trùng nhau (khác với khái niệm tập hợp).
Các cạnh nối cùng một cặp đỉnh được gọi là các cạnh
song song.
10
Các cạnh nối từ một đỉnh với chính nó được gọi là
khun.
Ví dụ
e1
a) Đa đồ thị vơ hướng: e1 và e2 là
b) Đa đồ thị vơ hướng: e là khun
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.
a) Đơn đồ thị có
11
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
a) Đa đồ thị có hướng: e1 và e2 là các
b) Đa đồ thị có hướng: e
là cung song song. khun .
Định nghĩa 5:
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
khun 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>.
12
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:
V = {1, 2, 3, 4, 5, 6}
E = {(1,2), (2,3), (1,4), (1,5), (2,5), (4,5), (2,4)}
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
13
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.
Ví dụ
Xét đồ thị có hướng G = <V,E> sau:
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+(2)=2 deg+(3)=1
deg+(4)=1 deg+(5)=2 deg+(6)=2
14
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
+ Đồ 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
15
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:
Cài đặt trên mảng:
1
2
3
4
5
(1,3)
(2,4)
(3,5)
(4,1)
(5,2)
5
2
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.
16
• 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 tố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à 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ị.
Đỉnh
Đỉnh liền kề
1
2, 3,4, 5
2
1,3, 4, 5
3
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ề:
17
• Đố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.
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
2
3
4
5
0
1
1
1
1
1
0
1
1
1
1
1
0
1
0
1
1
1
0
0
1
1
0
0
0
18
1
2
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:
• 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.
19
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
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
e1 e2 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
20
1.2. Độ phức tạp tính tốn và tính hiệu quả của thuật tốn
1.2.1. Định nghĩa thuật tốn
Thuật tố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 tố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 tố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 tốn.
Mỗi thao tác biến đổi bài tố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 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
tốn nối tiếp nhau nhằm biến đổi bài tố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
tố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:
21
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 tố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ì 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 tốn mà dữ liệu đầu vào lớn thì tiêu chuẩn này
là rất quan trọng.
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 tố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 tố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 tố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.
22
Bước thứ hai trong việc phân tích thời gian chạy của một
thuật tố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 tố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 tố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 tốn.
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 tố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 tốn. Khi tối ưu một thuật tốn ta
thường dựa vào một ngun lý, đó là ngun l Profile : ― Tìm điểm
mất thời gian nhiều nhất của thuật tốn ―.
Một số kỹ thuật thường dùng để tối ưu thuật tố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 tố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.
23
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}
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);
24
< 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: q 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)).
Q 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)
Cơ sở của phương pháp cài đặt này là "lập lịch" duyệt các đỉnh.
Việc thăm một đỉnh sẽ lên lịch duyệt các đỉnh kề nó sao cho thứ tự
duyệt là ưu tiên chiều rộng (đỉnh nào gần S hơn sẽ được duyệt
trước). Ví dụ: Bắt đầu ta thăm đỉnh S. Việc thăm đỉnh S sẽ phát sinh
thứ tự duyệt những đỉnh (x1, x2, ..., xp) kề với S (những đỉnh gần S
nhất). Khi thăm đỉnh x1 sẽ lại phát sinh u cầu duyệt những đỉnh
(u1, u2 ..., uq) kề với x1. Nhưng rõ ràng các đỉnh u này "xa" S hơn
25