1. Trang chủ
  2. » Cao đẳng - Đại học

cấu trúc dữ liệu và giải thuật lý thuyết neu

259 254 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 259
Dung lượng 392,31 KB

Nội dung

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 3

4, 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 10

sử 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 15

Next: 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 19

vµ 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 20

Ta 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 23

Unvisited:= [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 24

Chú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 50

Tiề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 53

Sè î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 58

m : =I;

Fo

r J : = i+1 to n do

Ifk[j]<k[m] then m: = j;

If m <> I then

Begin

x

k

i : = km;

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 62

Trong 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

Ngày đăng: 30/05/2018, 22:04

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w