6.1.1 Khái niệm Đồ thị có hớng Directed graph gồm một tập hợp hữu hạn các phần tử gọi là nút hay đỉnh, cùng với một tập hợp hữu hạn các cạnh có hớng nối các cặp đỉnh với nhau.. một nú
Trang 1
Bộ mụn: Cấu trỳc dữ liệu và giải
thuật Chơng 6 cấu trúc dữ liệu kiểu Đồ
thị ( Graph )
Trong chơng 5 chúng ta
đã nghiên cứu một loại cấutrúc phi tuyến là cây Cây làmột trờng hợp đặc biệt củamột loại cấu trúc dữ liệu tổngquát hơn ,đó là đồthị( Graph) Trong chơng này,chúng ta sẽ nghiên cứu hai loại
đồ thị là đồ thị có hớng và
đồ thị vô hớng
6.1 Đồ thị có hớng
Trang 2
6.1.1 Khái niệm
Đồ thị có hớng ( Directed graph ) gồm một tập hợp hữu hạn các phần tử gọi là nút hay đỉnh, cùng với một tập hợp hữu hạn các cạnh có hớng nối các cặp đỉnh với nhau
Chẳng hạn cho đồ thị sau
đây:
Trang 34, 1 đến 5, 2 đến 4, 3 đếnchính nó,4 đến 2, và 4 đến
3
Cây có thể coi là trờnghợp đặc biệt của đồ thị có h-
Trang 4
ớng và đợc đặc trng bởi tínhchất là một trong các nút, nútgốc,không có cạnh nào hớng
đến nó, và tất cả các nút cònlại có thể đạt đến từ nút gốcbằng một đờng duy nhất .Nghĩa là ,chỉ đi theo một vàchỉ một dãy các cạnh liên tiếp Đồ thị trên đây có mộtnút "gần giống nh nút gốc"
( Không có cạnh nào hớng đếnnó) là nút 1, nhng có nhiều đ-ờng khác nhau từ nút 1 đếnnút 3
Ví dụ:
Trang 5
1 4 2 3
Sau đây là một ví dụ khác về đồ thị: 1
2
6
5 4 3
Trong trờng hợp này ta có các
đờng đi nh sau:
Trang 6
Đồ thị có rất nhiều ứngdụng trong thực tiễn Đồ thị
có hớng đợc dùng để thiếtkế,phân tích các sơ đồ mạng
điện, biểu diễn đờng găngtrình tự thực hiện các hạngmục trong một công trìnhxây dựng
Ví dụ :
Đồ thị có hớng biểu diễn quátrình lập kế hoạch sản xuấttrong một doanh nghiệp
Trang 7
3.1
1 2 3 3.2 4 5
3.3
1 Đ ặt mục tiêu kế hoạch
2 Nghiên cứu thị tr ờng
3 Đ ánh giá các tiềm năng của danh nghiệp
kế hoạch ,bắt đầu từ công
đoạn tiền kế hoạch là nghiêncứu thị trờng đến công đoạn
Trang 8
cuối cùng là thực hiện kếhoạch
6.1.2 Phơng pháp cài đặt
đồ thị có hớng
Một phơng pháp rấtthông dụng để cài đặt đồthị là sử dụng ma trận kề( Adjacency matrix) Để xâydựng ma trận kề ,trớc hếtchúng ta đánh số các nút của
đồ thị có hớng 1,2,2 n Matrận kề là ma trận Adj bậc n x
n trong đó thành phần ở hàng
i, cột j có giá trị 1 nếu có mộtcạnh từ i đến j ,và có giá trị onếu khác
Trang 10sử dụng thêm một ma trậnData chỉ gồm một cột chứacác giá trị này , trong đó dữliệu của nút thứ i đợc lu trữ tạiData[i] Nh vậy chúng ta cóhai mảng :
Trang 11để lu trữ các phần tử này.Chúng ta có thể sử dụng ph-
Trang 12
ơng pháp lu trữ ma trận kềbằng danh sách liên kết theohàng( Linked Row List) chúng
ta sẽ có cách biểu diễn danhsách kề cho một đồ thị có h-ớng
Trang 14
một nút đầu lu trữ dữ liệucho nút ấy và chứa một contrỏ chỉ đến một danh sáchliên kết của các nút kề ( Nút
đợc nối với i theo hớng từ i đira) Mỗi nút kề có hai trờng :trờng số nguyên ,lu trữ dữliệu của nút và một trờng liênkết chỉ đến nút tiếp thẻotrong danh sách kề này
Cách biểu diễn đồ thị
có hớng bằng danh sách kề cóthể đợc cài đặt với các khaibáo nh sau:
Const
MaxVertices= ( Số các nútcủa đồ thị có hớng)
Trang 15Next: AdjPointer end;
Trang 16Để xây dựng các danh sách
kề cho một đồ thị có hớng
chúng ta phải thực hiện các giải thuật cơ bản xử lý danh sách kề
Giải thuật thiết lập danh sách kề
Trang 17
Gải thuật thiết lập danh sách
kề đợc biểu diễn nh sau:
For i:= 1 to MaxVertices thựchiện các bớc sau đây:
1 - Lấy một nút đầu đợc chỉbởi V[i] và khởi động trờngNext của nó tại giá trị Nil
2 - Đọc dữ liệu trong nút nàyvào trờng dữ liệu V[i]^.Datacủa nút đầu
3 - Với mỗi nút kề với nút i ( Cóhớng từ i đi ra) thực hiện cácbớc sau đây:
a Đọc số của nút ấy
b Chèn số này vào danhsách liên kết của các nút kề
đợc chỉ bởi V[i]^.Next bằng
Trang 18
cách dùng một trong các giảithuật chèn trong danh sách đãxét trong chơng 5
Giải thuật tìm theo chiều sâu
Để hiểu rõ bản chất củagiải thuật tìm theo chiều sâu( Depth- First Search) chúng taxét đồ thị có hớng sau đây:
Trang 19vµ th¨m nót nµy Tuy nhiªn ,tríckhi th¨m c¸c nót con kh¸c,chóng ta th¨m c¸c nót concña B theo chiÒu s©u Chóng
ta chän mét trong c¸c con cña
Trang 20Ta có:
A,B,E,F,H
Nh vậy, chúng ta đãxem xét xong nút B và các concháu của nó Chúng ta trở lạinút A và tiếp tục thăm các nútcon ( C và D ) của nó Ta cócác trình tự sau đây:
A,B,E,F,H,C
Trang 21
A,B,E,F,H,C,D,G
Giải thuật sau đâythực hiện việc tìm theochiều sâu trong một đồ thị
có hớng ,đợc biểu diễn bắngcác danh sách kề , bắt đầu
từ nút Start Tập hợp Unvisitedchứa các số của các nút cha đ-
Trang 22
NewStart: VertexNumber;
Begin
(* Chèn các lệnh để x lýV[Start]^.Data*)
Unvisited-V[Start];
(* Quét danh sách kề tìmtheo chiều sâu*)
CurrPtr:= CurrPtr^.Next
end;
end;
Trang 23Unvisited:= [1 NumVertices]trớc khi gọi thủ tụcDepthFirstSearch, trong đóNumVertices là số các núttrong đồ thị có hớng.
Giải thuật tìm theo chiều rộng
Xét đồ thị có hớng:
Trang 24Chúng ta xem xét việc quét
đồ thị này theo chiều rộng Trớc hết chúng ta bắt đầu từgốc, thăm gốc và các con của
nó , chẳng hạn từ phải sangtrái:
A,B,C,D
Sau đó tiến hành thăm cáccon của các nút trong mức
đầu tiên này:
Trang 25
A,B,C,D,E,F,G
và cuối cùng chúng ta thăm cácnút con của các nút trong mứcthứ hai:
A,B,C,D,E,F,G,H Giải thuật sau đây thực hiệnviệc tìm theo chièu rộng trongmột đồ thị có hớng :
Bớc 1 Thăm nút xuất phát
Bớc 2 Khởi động một Queuechỉ chứa nút xuất phát
Bớc 3 While( Queue khôngrỗng) thực hiện các bớc sau
đây:
* Lấy một nút V từ hàng
đợi
Trang 26
* Với tất cả các nút W kềvới V thực hiện các bớc sau
đúng một lần dựa trên cơ sởtìm kiếm theo chiều sâu:
1 Khởi động một tập hợp
Unvisited chứa các số của cácnút trong đồ thị
Trang 27
2 While ( Unvisited khác rỗng)
làm các bớc sau đây:
a Chọn một nút xuất phát từtập Unvisited
b Dùng giải thuật tìm theochiều sâu để thăm tất cả cácnút có thể đạt đợc từ nút xuấtphát này
6.2 Đồ thị vô hớng
6.2.1 Khái niệm
Đồ thị vô hớng gồm một tập hợp hữu hạn các phần tử gọi
là nút hay đỉnh cùng với một tập hợp hữu hạn các
Trang 28
cạnh nối các cặp đỉnh với nhau.
Nh vậy , đồ thị vô hớngkhác với đồ thị có hớng ở chỗcác cạnh của nó không đợc
định hớng và không có mộtnút nào đợc nối với chính nó
Trang 29
§å thÞ trªn ®©y bao gåm 5nót A,B,C,D,E vµ c¸c c¹nh nèic¸c nót
- Dïng ma trËn kÒ
- Dïng danh s¸ch kÒ
- Dïng danh s¸ch c¸c c¹nh
Trang 30
Dùng ma trận kề
Cũng nh đồ thị có hớng ,chúng ta có thể biểu diễn đồthị vô hớng bằng ma trận kề Chẳng hạn , ma trận kề của
đồ thị ở trên biểu diễn nhsau:
Trang 31
những cạnh này không có ớng ,số 1 này cũng có mặttrong hàng J cột i Nh vậy , matrận kề của đồ thị vô hớng làmột ma trận đối xứng
h-Dùng danh sách kề
Bây giờ chúng ta dùng danhsách kề để biểu diễn đồ thịvô hớng trên đây:
Trang 33đồ thị và nó có dạng sau
đây:
Trang 34điểm cuối , và Link[2] chỉ
đến một cạnh khác cóVertex[2] nh là một điểmcuối Ngời ta dùng một mảng Vchứa các con trỏ chỉ đến cácnút đầu lu trữ các mục dữliệu của các nút, nút đầu đợc
Trang 35
chỉ bởi V[i] cũng chứa một ờng liên kết chỉ đến một nútcạnh có nút thứ i là một trongcác điểm cuối của nó
tr-Biểu diễn danh sách cạnh của
Trang 36
Các giải thuật tìm theo chiềusâu, chiều rộng, giải thuậtquét đồ thị, giải thuật tìm
đờng ngắn nhất trong đồ thịcũng tơng tự nh đối với đồthị có hớng đã xét trong mụctrớc đây
Đồ thị vô hớng có nhiều ứngdụng trong việc mô phỏng cácsơ đồ mạng điện , các hệthống giao thông liên lạc vv
Trang 38
Câu hỏi và bài tập chơng 6
Bài 1
Tìm đồ thị có hớng biểu diễnbởi ma trận kề Adj và ma trậndữ liệu Data cho dới đây:
Trang 41- BiÓu diÔn b»ng danhs¸ch kÒ
- BiÓu diÔn b»ng danhs¸ch c¹nh
Trang 45
Chơng 7 Sắp sếp - SORTING
Vấn đề sắp xếp có vaitrò quan trọng trong các bàitoán thực tế Chẳng hạn để
xử lý một tệp hoá đơn thanhtoán trong một ngân hàng ng-
ời ta sắp xếp tệp hoá đơn
đó theo thứ tự tăng dần của
số hiệu hoá đơn Trong mộtbiểu tổng hợp kết quả kinhdoanh cần sắp xếp cột tiềnbán hàng theo chiều tăng dầnhay giảm dần Việc sắp xếp
Trang 46
theo một trờng nào đó (gọi làtrờng khoá) tạo điều kiệnthuận lợi cho việc tìm kiếmthông tin Yêu cầu tìm kiếmcũng xuất hiện thờng xuyêntrong các bài toán thực tế,chẳng hạn tìm kiếm một hoá
đơn khi cho số hiệu của hoá
đơn ấy.v.v
Một giải thuật sắp thứ
tự đợc gọi là tốt nếu giải thuậtnày đòi hỏi vùng nhớ nhỏ vàthời gian thực hiện nhanh Tuynhiên, việc đánh giá giải thuậtcòn phụ thuộc vào thứ tự xuấthiện của các phần tử trong dãyban đầu; dãy ban đầu đã có
Trang 47
thứ tự hay cha có thứ tự theovùng khoá
Để tốn ít vùng nhớ thìgiải thuật phải sử dụng hữuhiệu các vùng nhớ của các phần
tử và hạn chế việc sử dụng cácvùng nhở tạm thời
Để đánh giá thời gianthực hiện của giải pháp sắpthứ tự, ta phải dựa vào hai đạilợng đặc trng là số lần sosánh (C) và số lần đổi chỗ haiphần tử (M) Hai đại lợng C và
M phụ thuộc vào tính chấtthống kê của dãy các phần tử
và phụ thuộc vào số phần tửcần sắp thứ tự (n)
Trang 48
Các giải thuật sắp thứ tự cóthể đợc chia thành ba nhómchính:
- Sắp thứ tự bằng phơng phápxen vào ( Insertion)
- Sắp thứ tự bằng phơng phápchọn lựa (Selection)
- Sắp thứ tự bằng phơng pháp
đổi chỗ ( Exchange)
Trong chơng này, chúng ta sẽ
đề cập đến một số giảithuật sắp xếp cơ bản
7.1 Một số khái niệm về sắp xếp theo khoá
Trang 49
Giả sử ta xét vấn đề xử
lý một tệp hoá đơn trongngân hàng, mỗi hoá đơn gồmcác trờng sau đây:
Mỗi hoá đơn có cấu trúc
nh sau:
Trang 50Tiềngửi
Ngàygửi
Key
Trong quá trìnhsắp xếp các bản ghi của tệphoá đơn sẽ đợc bổ trí lại các
vị trí sao cho giá trị khoátrong trờng tơng ứng với chúng
có đúng thứ tự ấn định Tathấy kích thớc của khoá thờng
là khá nhỏ so với kích thớc củabản ghi (Chẳng hạn trong tr-ờng hợp trên đây khoá là sốhiệu hoá đơn chỉ chiếm 1/5
Trang 51
của bản ghi) Nếu việc sắpxếp đợc thực hiện trên tất cảcác bản ghi của tệp sẽ dẫn
đến việc chuyển đổi vị trícủa tất cả các bản ghi, tức làphải sao chép toàn bộ bản ghivào các vùng nhớ mới, làm tốnrất nhiều không gian nhớ Đểkhắc phục điều này ngời taxây dựng một bảng phụ cũnggồm n bản ghi nh bảng chínhnhng mỗi bản ghi của nó chỉbao gồm hai trờng là khoá vàcon trỏ Trờng khoá chứa giátrị của khoá ứng với từng bảnghi trong bảng chính, trờngcon trỏ, trỏ tới bản ghi tơngứng Bảng phụ này gọi là bảng
Trang 52
khoá ( Key table) và việc sắpxếp sẽ đợc thực hiện trực tiếptrên bảng khoá đó Nh vậytrong quá trình sắp xếpbảng chính không hề bị ảnhhởng gì, còn việc truy nhậpvào bản ghi nào đó của bảngchính vẫn có thể thực hiện
đợc bằng cách dựa vào con trỏcủa bản ghi tơng ứng thuộcbảng khoá này.Sơ đồ sau
đây cho thấy mối liên hệgiữa bảng khoá và bảngchính:
Bảng
khoá
Bảng chính
Trang 53Sè îng
Sè îng
eySau khi s¾p xÕp theo chiÒut¨ng dÇn cña trêng kho¸ ta cã:
Trang 54
5
Tên
Số ợng
Số ợng
là đại diện cho các bản ghi
Trang 55
Do đó khi trình bày giảithuật với các bản ghi chúng tachỉ nói tới giá trị khoá Bàitoán sắp xếp đối với các bản
bài toán sắp xếp với dãy khoá
K1,,K2 Kn
Trong các thuật toán dới
đây, chúng ta giả sử trờngkhoá chứa các giá trị số vàtrình tự sắp xếp là tăng dần[1,2]
7.2 sắp xếp kiểu lựa chọn (Selection Sort)
T tởng chủ đạo của giảithuật sắp xếp kiểu lựa chọn
Trang 56
là ở lợt thứ I ta sẽ chọn trong
Nh vậy sau J lợt, J khoánhỏ hơn đã lần lợt ở các vị tríthứ nhất, thứ hai thứ J theo
Trang 57
nhất, ta đổi chỗ lần lợt cho
74, 23 và 42 Bây giờ số hiệuhoá đơn 11 đứng ở đầu dãykhoá Trong các khoá còn lại, sốhiệu hoá đơn 23 là nhỏ nhất
ở bớc 3 trong các khoá còn lại(42,74,55,58,94,36,99,87)
Var
x: real;
Trang 58m : =I;
Fo
r J : = i+1 to n do
Ifk[j]<k[m] then m: = j;
If m <> I then
Begin
x
k
i : = km;
Trang 59
end;
end;
end;
Trong giải thuật này ởlệnh k đầu tiên biến I nhậngiá trị từ 1 đến n -1 (chứkhông phải là đến n) vìphép so sánh ở dới J : = I+1,
điều này đảm bảo cho việc
so sánh đợc thực hiện với
đúng n khoá
7 3 Giải thuật sắp xếp
kiểu thêm dần
Trang 60
( Insertion Sort)
ý tởng của phơng phápnày nh sau: ở giai đoạn đầu
ta coi nh chỉ có một thành
xác định vị trí “chèn” của nó( về phía trái hay phía phải
Trang 61
Gi¶i thuËt nh sau:
Procedure InsertionSort ( k : Vector; Var n : integer);
x
J :
= I-1;
Trang 62Trong giải thuật này tadùng x làm ô nhớ phụ chứakhoá mới đang xét Khoá mới
đều đợc chèn vào giữa khoánhỏ hơn nó và khoá lớn hơn
Trang 63
giá trị nhỏ hơn mọi khoá củabảng và đứng trớc mọi khoákhác
7.4 Giải thuật sắp xếp
kiểu đổi chỗ ( Exchange Sort)
T tởng của giải thuật nhsau: Toàn bộ các khoá đợcduyệt từ đáy lên đỉnh Nếugặp hai khoá kế cận ngợc thứ
tự thì đổi chỗ chúng chonhau Nh vậy lần đầu khoá cógiá trị nhỏ nhất sẽ chuyển dầnlên đỉnh và ở vị trí đầu tiên.Lần thứ hai khoá có giá trị nhỏthứ hai sẽ chuyển dần lên
Trang 64
chiếm vị trí thứ hai v.v Nhvậy các khoá có giá trị nhỏ sẽ “nổi” dần lên trên, các khoá cógiá trị lớn sẽ “chìm” dầnxuống dới vì vậy ngời ta còngọi phơng pháp này là giảithuật sắp xếp kiểu “bọt nớc”[1,2]
Giải thuật đợc viết dới dạngmột thủ tục nh sau:
Trang 65
For I : = 1 to n-1do
For J : = n down toi+1 do
Trang 66
Từ việc phân tích giảithuật đổi chỗ ta thấy mộtvấn đề sau đây:
Sau lợt thứ ba ngoài bakhoá 11, 23, 35 đã đợc sắpxếp còn 2 khoá nữa (42,58)
đã đợc sắp xếp và ở lợt thứ 4toàn bộ khoá đã đợc sắp xếpxong Năm lợt sắp xếp cuốikhông còn tác dụng gì nữa
Do đó có thể cải tiến giảithuật này để giảm số lầntính toán A.R Harre đã cảitiến nh sau:
Chọn một khoá ngẫunhiên nào đó của dãy làm
“chốt” (Pivot) Mọi phần tửnhỏ hơn chốt đợc “xếp vào vị
Trang 67
trí sau chốt( Tức là phần tửcuối dãy) Muốn vậy, các phần
tử trong dãy sẽ đợc so sánh vớikhoá chốt và sẽ đổi vị trí chonhau hoặc cho chốt hoặc nólớn hơn chốt mà lại nằm trớcchốt hoặc nhỏ hơn chốt màlại nằm sau chốt Khi đổi chỗxong, dãy số đã đợc phân chiathành hai đoạn: Một đoạngồm các khoá nhỏ hơn chốt,một đoạn gồm các khoá lớnhơn chốt, còn khoá chốt thìnằm giữa hai đoạn trên đây
ở các bớc sau cũng áp dụng kỹthuật tơng tự đối với cácphân đoạn còn lại