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

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

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 (714.83 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 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,3) 

(2,4) 

(3,5) 

(4,1) 

(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ề 



2, 3,4, 5 



1,3, 4, 5 



1,2,4 



1,2,3 



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. 
    

























































 

18




 

 







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 















v2  1 
















v3  0 















v4  0 
















v5  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

 


×