1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình Cấu trúc dữ liệu và giải thuật (Nghề Tin học ứng dụng - Trình độ Cao đẳng) - CĐ GTVT Trung ương I

60 44 1
Tài liệu được quét OCR, nội dung có thể không chính xác
Tài liệu đã được kiểm tra trùng lặp

Đ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 60
Dung lượng 6,67 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Giáo trình Cấu trúc dữ liệu và giải thuật (Nghề Tin học ứng dụng - Trình độ Cao đẳng) gồm có những nội dung chính sau: Chương 1: giải thuật; chương 2: cấu trúc mảng; chương 3: danh sách; chương 4: ngăn xếp (stack) và hàng đợi (queue); chương 5: cấu trúc cây(tree); chương 6: đồ thị (graph).

Trang 1

BỘ GIAO THÔNG VẬN TẢI TRUONG CAO DANG GIAO THONG VAN TAI TRUNG ƯƠNG Ï

Ban hanh theo Quyét dinh s6 498/QD-CDGTVTTWI-DT ngay 25/03/2019

của Hiệu trưởng Trường Cao đẳng GTVT Trung ương I

Trang 3

TUYEN BO BAN QUYEN

Tài liệu này thuộc loại sách giáo trình nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dẫn dùng cho các mục đích về đào tạo và tham khảo

Mọi mục đích khác mang tính lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu

lành mạnh sẽ bị nghiêm cắm

Mã tài liệu: THUD - MH15

Trang 4

LỜI NÓI ĐẦU

Giáo trình này là một trong những giáo trình chính yếu của ngành Tin học ứng dụng Giáo trình được xây dựng theo phương châm vừa đáp ứng yêu cầu chuẩn mực của sách giáo khoa, vừa có giá trị thực tiễn, đồng thời tăng cường khả năng tự học, tự nghiên cứu của sinh viên Trên cơ sở đó, chúng tôi đã nghiên cứu & tham khảo nhiều tài liệu có giá trị của các tác giả trong và ngoài nước

Giáo trình được dùng làm tài liệu học tập cho sinh viên ngành Tin học ứng dụng Trình độ Cao đẳng — Trường Cao đẳng GTVT Trung ương I

Va lam tai liệu tham khảo nội bộ cho Giáo viên

Trong quá trình biên soạn, sẽ không thể tránh khỏi những thiếu sót Chúng tôi rất

mong nhận được các ý kiến đóng góp đề giáo trình ngày càng hoàn thiện hơn

Xin chân thành cảm ơn!

NHÓM BIÊN SOẠN

Trang 5

SA, Din Ng ay .500-.ss0cressseresnrornsenonensnonsnsevesesoncnensuestenvaesenssswnnns ri CEnE1001800000100001100800070900100 26

3.2 Lưu trữ kế tiếm đối với danh sách +++++©+++vettEEEkkrritttkrrrirrrrrrrriiriee 26 3.3 Lưu trữ móc nối đối với danh sách +++++V+++++tEEEkLiEtE EE re 26

3.3.1 Giới thiệu phương pháp

3.3.2 Một số phép toán trên ds móc nối + ©+2++2E22+v221111222112111112 11, e 29 3.3.3 Một số dạng khách trong ds móc nối -¿ -+°2©©++++t#SEEYvvettErkrrrrrrkkkrree 32

Trang 6

CHƯƠNG 4: NGĂN XẾP (Stack) VÀ HÀNG ĐỢI (Queue) 2+-©©222+++2EE2++teettE2222errrrrtrrree 33 4.1 Định nghĩa Stack:

AQ LHŒKKẾHÊDVDTSEEGuetitdsutdtiotSiSNOOGOYGDGNOSHONSEOOSHANGGUGSdpHiuSRQiSMS 33 A.D Ap GUNG CHO SEIC Go cnunpgo hũ gu GA gà HH5 1441:461508ãE014813881881305414886184810513x846384083ã1338001848188 318501648008 35 4.3.1 Bài toán đổi cơ số từ thập phân sang nhị phân -+22++2++vvSE.11 10 re, 35 4.3.2 Biểu thức số học Ba-lan

s.1)0c1-089/( 08/0/17) (0) 6 39 5.1 Dinh ñehia và tiộE số kHái HIẾN ngà dt ga gãã60tiöigS0ãxãS014301840516661:53101.518164256100138011a s04 39

5.2 Cây HRị BHÂNTE:c¡ccccccc0ncgiinbicc G5 g101ö 4ù: GiảyG4gãga635344g611845455130402383gGz41008:33g3G384gx1i4-1040140461G14S11 101 á đã 41

5S DA SOTA aces ssvucceovccaanovenzessccerssskessvassussssuesensaseanscensvsateassusensosdneasswconsencavanscsncasabeanesessenasens 41

6.2.1 Biểu diễn bằng ma trận lân cận .- 2: ©++9SVS2t9EEE12E211122211122111171112111121112 211 xe 55

6.2.2 Biểu diễn ma trận bằng danh sách lân cân .¿ + ©++©+++EE++++EEvxttEExvrrrrrrrrtrrrr 56

6:3: Áb dUNẾ :eecbcggsggggidồngGiigHiiitttqGqGGIGRNHERiS0GGGĂRiSNiGiARisoiữạuligdaqsaugat 57

6,8/1.Bấi triển ti'đỮH ỔĨ sa nananonairiioi tạng hứng Hộ tanHR601510088.118/8181010a30/14L481813300u646101.48.814 8808 57

Trang 7

CHƯƠNG 1: GIẢI THUẬT

Giới thiệu về môn học:

Cấu trúc dữ liệu và giải thuật là một trong những môn học cơ bản của sinh viên

nghành CNTT khi muốn tiếp cận với lập trình và xây dựng phần mềm Cấu trúc dữ liệu và các giải thuật được xem như là yếu tố quan trọng nhất trong lập trình Chương trình phần mềm = Cấu trúc + Giải thuật

Cấu trúc đữ liệu có thể được xem như là một phương pháp lưu trữ đữ liệu trong

máy tính nhằm sử dụng một cách có hiệu quả những dữ liệu này Và để sử dụng các dữ liệu một cách hiệu quả thì cần có các thuật toán áp dụng trên các dữ liệu đó

Do vậy Cấu trúc dữ liệu và giải thuật là 2 yếu tố không thể tách rời và có những liên quan chặt chẽ với nhau

1.1 Cấu trúc dữ liệu và giải thuật

- _ Giải thuật (Thuật toán): Giải thuật là một tập hữu hạn các phép toán cơ sở

được sắp đặt theo quy tắc chính xác, nhằm giải một bài toán

- _ Các phép toán cơ sở là các phép toán đơn giản mà thời gian thực hiện nó

luôn là một hằng số, nghĩa là nó không phụ thuộc vào kích thước của toán

hạng

- _ Các phép toán trong giải thuật luôn được xác định rõ ràng , không mập mo,

ai cũng có thể hiểu được cách thực hiện của nó

-_ Chú ý: Giải thuật có thể thay đồi khi cấu trúc đữ liệu thay đổi

1.2 Ngôn ngữ diễn giả:

- Nếu sử dụng đến một ngôn ngữ lập trình cấp cao nào đó chẳng hạn như Pascal, C Như vậy sẽ gặp một số hạn chế sau:

+ Phải luôn tuân thủ cú pháp chặt chẽ của ngôn ngữ đó, khiến cho việc trình

bày giải thật và cầu trúc dữ liệu có thiên hướng nặng nề, gò bó

+ Phải phụ thuộc vào cấu trúc dữ liệu tiền định (Mỗi một ngôn ngữ dữ liệu

dé ấn định sẵn những cấu trúc dữ liệu cho riêng mình)của ngôn ngữ lên

không thé hiện được dầy đủ các ý của từng giải thuật

+ Ngôn ngữ đã chọn không phải ai cũng ưa thích và sử dụng

-_ Như vậy ở đây ta sẽ dùng ngôn ngữ thô hơn có đủ khả năng diễn đặt đc giải thuật ta tạm gọi bằng các tên ngôn ngữ tựa Pascal.Các quy tác bắt đầu

Trang 8

1.2.1

1.2.3

Quy tác về cấu trúc chương trình:

Mỗi chương trình đều được ngắn một tên để phân biệt, tên này được viết

bằng chữ in hoa, có thể thêm dấu gạch nói va bắt đầu bằng từ khóa

Program

VD: Program TEN_CHUONG_TRINH

Độ dài tên không bị bạn chế

Sau tên có thể kèm theo lời thuyết minh (Ở đây ta quy ước dùng tiếng việt)

Phần thuyết minh được đặt giữa 2 đấu ‡ }

Ký tự và biểu thức

._ Ký tự dùng ở đây giống như các ngôn ngữ chuẩn

26 chữ cái Latinh in hoa hoặc in thường

10 chữ số thập phân

Các dấu phép toán số học +, -, %, /, † (Lñy thừa)

Các dấu phép toán quan hé: <, >, =, <>, #

Gia tri logic: True, false

Dấu phép toán logic: and, or, not

Tên biến: Dãy chữ cái và chữ số, bắt đầu bằng chữ cái

Biến chỉ số có hạng: A[ï], B[i,j] vv

Còn biểu thức, cũng như thứ tự ưu tiên cũng giống như các ngôn ngữ lập trình khác (Cộng trừ trước nhân chia sau .)

Trang 9

Si © 1, „n là các câu lệnh

Nó chõ phép nghép nhiều câu lệnh lại để thành một câu lệnh

Câu lệnh điền kiện

By: Sp;

Else : Sasi

End case

V6i B; (i=1,2 n) 1a cdc diéu kién

S¡ŒE I n): là các câu lệnh

Trang 10

Câu lệnh này cho phép phân biệt các tình huống xử lý khác nhau trong các điều kiện khác nhau mà không cần dùng đến câu lệnh if

lồng nhau Có thé điễn tả bởi sơ đồ

false false false

Nhằm thực hiện câu lệnh S với ¡ lat giá trị nguyên từ m tới n (n>=m) với

bước nhay tang =1

Hoac :

For i:=n down to m do S

Tương tự như câu lệnh trên với bước nhay giảm 1

b Với số lần lặp không biết trước

Trang 11

Chừng nào B có giá trị true thì thực hiện S

Hoặc;

Repeat S until B Lặp S cho tới khi B có giá trị đúng (S có thể là một dãy lệnh)

Read ( <Danh sách biến>)

'Write(<Danh sách biến hoặc dòng ký tự>)

Các biến trong danh sách cách nhau bởi dấu phẩy

Dòng ký tự là một dãy các ký tự đặt giữa 2 dấu °’

Trang 12

Từùkhóa oe u_ thay cho function

Trong cấu tạo của chương trình con hàm bao giờ cũng có câu lệnh gan

mà tên hàm nằm ở về trái Còn đối với tên hàm con thủ tục thì không có

Lời gọi chương trình con hàm thể hiện bằng tên hàm

Lời gọi của chương trình con thủ tục thể hiện bằng câu lệnh call có dạng:

Call<Tên thủ tục>(<Danh sách tham số thực>)

1.3 Thiết kế giải thuật

- _ Thiết kể kiểu top-down (Cách thiết kế đi từ tổng thể đến chỉ tiết - Chia để

tr)

Là tách bài toán ra thành các bài ra thành các bài toán con mỗi bài toán con

này lại áp dụng một chiến thuật tương tự (Chia nhỏ dần) cho tới khi tới

những bài toán con đủ nhỏ để có thể giải trực tiếp được Sau đó chỉ cần tổng

hợp lại các phéo xử lý để có giải thuật của bài toán gốc

a Cách làm:

- _ Xác định được dõ dữ liệu yêu cầu: Cho biết cái gi (Input) va doi hdi cai gi(out put)

- Dé giải quyết được yêu cầu thì phải làm gi

-_ Với mỗi công việc ấy thì phải làm thé nao?

VD: Ta xét bài toán sau : Sắp xếp dãy số (an, a2, ,a,) Thành dãy số tăng

¢ Décé de két qua output nhw vậy thì phải làm gì?

Có thể thấy rang sắp xếp theo kiểu tăng dần nghĩa là:

+ Số bé nhất trong N số phải được đặt ở vị trí đầu tiên

+ Số bé nhất trong (N-1) số còn lại phải đc đặt vào vị trị thứ 2

T+ VV

Như vậy có 2 công việc chính phải làm:

+ Chọn số bé nhất trong dãy số chưa được sắp xếp

Trang 13

+ Đặt nó vào vị trí sau phần tử cuối của dãy số đã được sắp xếp

Chú ý: Lúc đầu dãy số còn rỗng, sau đó nó được bổ xung dần dần các phần

1 2 công việc được lặp lại n-l lần

For i:=1 to (n-1) do begin

2 Chọn số nhỏ nhất A[k] trong dãy các số

Afi], Afit1], A[n]

3 Hoán vị giữa A[k] và A[i]

4 Reture

5 End;

Bây giời ta đi sâu vào từng công việc

+ Chọn số nhỏ nhất trong dãy số: A[ï], A[†+1] , A[n]

K=I ;{Coi phần tử đầu là nhỏ nhất lúc đó, và giữ lại chỉ số của nó}

For J:= i+l to n do

If A[j]<A[k] then k:=j;

+ Hoán đổi cị trí cho nhau:

Hoán đổi giữa 2 vị trí A[k] và A[ï]

LOC :=A[K]; A[KIEA[T]; A[I]:=LOC;

Tổng hợp những ghi nhận ở trên ta đi tới một thủ tục thể hiện giải thuật sắp xếp,

bằng ngôn ngữ tựa pascal như sau:

Procedure Selection_sort (A,n);

Trang 14

L For i:=1 to (n-1) do begin {lặp n-1 lần}

2 K:=I; {Coi phần tử đâu tiên của dãy là nhỏ nhât}

3s For j:=1+1 to n do;

4 If A[j] < A[k] then k:=j;

5 Loc := A[k]; A[k] := A[i]; A[i] := Loc;

6 And;

7 Reture

1.4 Đánh giá giải thuật

- Khi một giải thuật được thực hiện thường nó liên quan đến 2 yếu tố

+ Không gian nhớ cần thiết cho những cấu trúc lưu trữ

+ Thời gian cần thiết để thực hiện

Nếu Thời gian thực hiện giải thuật càng nhanh thì không gian nhớ cần thiết

cho cấu trúc lưu trữ đữ liệu càng lớn Thông thường thời gian thực hiện giải thuật vẫn được chú ý nhiều hơn Vì vậy ta sét tới việc đánh giá thời gian

thực hiện giải thuật

- Cùng một bài toán nếu giải thuật A1 có thời gian thực hiện là :

Ti(n)=8n

- Giải thuật A2 có thời gian thực hiện là : T;(n)=2n?

- Ta thay khi n đủ lớn thì T;(n) < T›(n) (Chỉ cần n=4) và n càng lớn thì

sự chênh lệnh càng rõ Như vậy lúc đó ta có thể nói:

- Khi n đủ lớn thì giải thuật A1 nhanh hơn giải thuật A2

1.5 Giải thuật đệ quy

1.5.1 Định nghĩa:

-_ Đệ quy là một khái niệm rất qua trọng trong tin hoc

- Một đối tượng gọi là đệ quy nếu nó bao gồm chính nó như một bộ phận

- Mét ham goi la đệ quy nếu trong định nghĩa của nó lại có dạng là chính nó

VD : Ham tinh giai thừa của một số nguyên dương với quy ước 0!=I thì

hàm này sẽ được định nghĩa như sau:

1 Néu n=0 thi n!=1

2 Néu N>0 thi n!= n(n-1)!

Nhu vay trong dinh nghia n! lai cé (n-1)! Do chinh 1a tinh dé quy

Trang 15

VD: Ta muốn tính 4! Theo định nghĩa ta có:

Với số đầu là 1 và 1 thì số sau là tổng của hai số đứng trước nó Các

số này được cai là giá trị của ham Fib với đối số là số nguyên dương n

mà ta gọi là hàm Fibonacci Ta có thê định nghĩa hàm này như sau:

- Néu n=! hoac n=2 thì Fib(n)=1

- Néu n>2 thi Fib(n)=Fib(n-1) + Fib (n-2)

-_ Từ đó ta có thể viết giải thuật tính giá trị của Fib(n) dưới dạng thủ túc đệ quy

3 Bài toán tháp Hà Nội

Đây là một bài toán mang tính chất một trò chơi và có nội dung như sau:

Trang 16

Có n đĩa kích thước nhỏ dần, đĩa có lỗ ở giữa , có thể sắp xếp chúng chồng

lên nhau xuyên qua một cọc, to ở dưới , nhỏ ở trên , để cuối cùng có một

chồng đĩa giống như cái tháp (Như dạng táp rùa ở hồ gương Hà Nội)

-_ Có n cọc A, B, C Hiện N đĩa đang được xếp ở cột A yêu cầu đặt ra: Chuyển cọc đĩa tir coc A sang cọc C, theo những điều kiện sau

1 Mỗi lần chỉ được chuyển 1 đĩa

2 Không khi nào có tình huống đĩa to ở trên, đĩa nhỏ ở dưới

3 Được phép sửa dụng 1 cọc làm cọc trung chuyên Chẳng hạn khi chuyển

từ A sang cọc C thì cọc B được làm cọc trung chuyển

Ta xét một vài trường hợp đơn giản

a N=1(Chỉ có một đĩa) thì ta chỉ cần 1 phép chuyển

Chuyển đĩa đang ở A sang C (Ký hiệu là A->C)

b N=2 phải thực hiện 3 phép chuyển

+ Chuyển đĩa thứ nhất từ cọc A sang cọc B (AB)

+ Chuyển dia thir 2 tir coc A sang coc C (ADC)

+ Chuyển đĩa từ cọn B sang cọc C (BDC)

c Trường hợp N>2

Ta thấy nếu coi (n-1) đãi ở trên đóng vai trò như đĩa thứ nhất thì có

thể hình dung như đang có 2 đĩa ở cọc A Nếu vay ta co thé có giải thuật như sau:

+ Chuyển (n-1) đĩa trên từ A->B

+ Chuyển dia thir n tr ADC

+ Chuyển (n-1) đĩa từ B->C

Vậy cách giả này mang tính chất đề quy và giải thuật tương ứng sẽ

được thể hiện qua thủ tục đệ quy như sau:

Procedure HaNoi(n, A, B, C)

1 Ifn=1 then chuyén dia tir A sang C

2 Else begin call HaNoi(n-1,A ,C, B)

Call HaNoi (1, A,B, C)

Trang 17

Call HaNoi (n-1, B,A, C)

HANOI (1, B, C,A):B-> A HANOI (2, B, A, C) HANOI (1, B, A, C): BoC

HANOI (1, A, B,C): A> C

Trang 18

2 Giải thuật đệ quy thường gắn gọn và cách viết khá đơn giản đó là điều kiện thuận lợi cho người lập trình nếu như họ biết cách khai thác được tính đệ

quy trong phép giải Tuy nhiên điều đó không có nghĩa là chúng ta thực hiện

nhanh Với hàm giai thừa hoặc hàm Fibonacci néu 6 trén ta cd thể lập được

giải thuật không đệ quy (Dùng phép lặp đề tính) mà thời gian thực hiện sẽ nhanh hơn

3 Vi vay chỉ lên coi để quy là một công cụ để giải bài toán Đối với người làm

tin học cũng lên làm quen với cách tiếp cận đệ quy, khi thiết lập giải thuật,

và đánh giá được thời gian thực hiện giải thuật

4 Ngôn ngữ pascal,, hay C vv đều cho phép viết thủ tục dưới dạng đệ quy

Có nghĩa là chương trình dịch của ngôn ngữ này sẽ dảm nhiệm việc chuyển thủ tục đó sang một thủ tục tương đương mà không phải là để quy (Gọi là khử đệ quy) vì trong máy tính điện tử không hề có phép tính đệ quy

CHƯƠNG 2: CẤU TRÚC MẢNG

2.1 Định nghĩa:

Mang 1a tập hợp các ký tự , bao gồm một số xác định N phan tử (n được gọi là

độ dai hay kích thước của mảng) Ngoài giá trị mỗi phần tử của máng còn được đặc trưng bàng chỉ số index, thể hiện thứ tự của phần tử đó trong mảng Các giá trị của phần tử mảng đều cùng một loại

Đối với mảng thường có các phép toán sau:

+ Tạo lập một mảng

+ Duyệt qua các phần tử của mảng

+ Tìm kiếm một phần tư của mảng

SE Sắp xếp các phần tử trong mảng theo một thứ tự ấn định .vv

Vì số phần tử của mảng là có định lên không có phép bổ xung phần tử mới vào bảng hoặc loại bỏ phần tử ra khỏi mảng

- Vecto là mảng một chiều, mỗi phần tử của nó ứng với một chỉ số

VD: Phần tử véc tơ A, ký hiệu là A; hoặc A[ï] với ¡ là chỉ số

-_ Ma trận là mảng 2 chiều mỗi phần tử của nó ứng với 2 chỉ số

Vd: Phần tử ma trận B , ký hiệu là Bị hoặc B[Lj] với I là chỉ số hàng, j là chỉ

sô cột

Trang 19

2.2 Cấu trúc lưu trữ mắng

2.2.1 Khái quát về cách lưu trữ:

- _ Bộ nhớ của máy tính là một dãy các phần tử nhớ cớ sở được đánh số kế tiếp

nhau (kể từ số 0) Thứ tự đó được gọi là địa chỉ

-_ Có 2 cách để xác định địa chỉ ô nhớ

+ CI Đựa vào đặc tả lưu chữ dữ liệu đề tính trực tiếp ra địa chỉ Địa chỉ loại

này gọi là địa chỉ được tính (computer address) Cách này thường được sử dụng trong chương trình dich của các ngôn ngữ lập trình để tính địa chỉ các phần tử của mảng

+ C2 Lưu trữ các địa chỉ cần thiết ở một chỗ quy định, khi cần xác định sẽ lấy từ đó ra Loại đại chỉ này gọi là địa chỉ con trỏ (pointer) hoặc mối nối link

2.2.2 Lưu trữ kế tiếp đối với mắng:

- Thông thường mảng được lưu trữ trong máy dưới dạng vectơ (Gọi là vecto lưu tữ ) Đó là một dãy các từ máy kế tiếp nhau vì vậy gọi là các lưu trữ kế tiếp

VD: Luu mang 1 chiều hay 1 vecto A

+ Phần tử mảng là A[i] voi l<I<n

+ Mỗi phần tử của vecto được lưu trữ trong một ô nhớ gồm có 1 từ máy để thể hiện nó

+ Vậy để lưu vecto A thì phải dùng đến n từ máy kế tiếp nhau đó chính là n

phần tử của vecto lưu trữ V(V là vecto lưu trữ vecto đang xét) Phan tir V[i] của vecto V sẽ chứa phần tử A[ï] của vecto đang sét

+ Nếu mỗi phần tử của vecto lưu trữ V (Mỗi ô nhớ của V) phải gồm w thừ máy mới đủ chứa một phần tử A[ï] thì lúc đó V phải bao gồm n*w từ máy

kế tiếp Đại chỉ mỗi ô nhớ , nghĩa là mỗi phần tử V{ï] bây giờ là địa chỉ của

từ máy đầu tiên của ô nhớ

VD: nếu w=3 đại chỉ của V[1]=1000 thì đại chỉ của V[2]=1003, VỊ3]=1006

Trang 20

Vii) V[2) VI] Vin]

-_ Đại chỉ của V[I] gọi là đại chỉ gốc ký hiệu là L,

- _ Như vậy việc xác định địa chi V[i] hay nói cách khách là A[i] được tính theo công thức như sau:

+ Khi mắng lưu trữ kế tiếp thì việc truy cập vào phần tử của mảng được

thực hiện một cách trực tiếp „ lên tốc độ truy cập nhanh

2.3 Áp dụng

Trang 21

2.3.1 Sắp xếp trên cấu trúc mảng

- _ Đặt bài toán: Sắp xếp là quá trình bố trí lại các phần tử của một tập đối

tượng nào đó theo một thứu tự ấn định

- VD: Cho mét day số A gồm n phần tửu khác nhau , mà ta coi như là n vecto

với n phần tử : A[1], A[2] , A[n]

Trong đó A[i]#A[i] voi i#j voi 1<= I, j<=n

Hãy sắp sếp các phần tir A dé chuyên nó thành một dãy số có thứ tự tăng

Quá trình sắp xếp được minh họa theo bảng sau:

Luot Sốnhỏnhấ A[I] A2] A[3] A[4] Al5] A6] AI7I A[R]

Dấu —_——————————¬ Chỉ dãy con chưa được sắp

b Sắp xếp theo kiểu thêm dần

- Nhu sap xép cac quan bai trén tay theo | tran tu nao đây

- V6i day sé A thi hoat dau A[1] coi như một dãy con được sắp xếp A[2] sẽ được xét tới : Nếu A[2]<A[1], thì nó được chèn vào trước A[1], còn nếu

2

Trang 22

A[2] > A[I], nó sẽ được giữ nguyên tại chỗ (Coi như nó được chèn vào sau

A[1])

-_ Dãy con A[1], A[2] bây giờ coi như được sắp xếp, và A[3] được xét tới , tùy

theo kết qua cảu việc so sánh A[3] với A[2], A[I] nó lại được trèn vào hoặc

sau A[2], hoặc giữa A[1] và A[2], hoặc trước A[I]

- Qua trinh tiếp tục với A[4], A[5] cho tới khi toàn bộ dãy A được sắp xếp

lugt’ sốđượcxếi A[l]l A[2] A3] A4l AI] A[6] A[7] Als]

us

Sau đây là giải thuật sắp xếp kiểu thêm dần

Procedure insert- sort (A,n)

{Trong thủ tục này người ta dùng X làm một ô nhớ phụ để chứa khóa mới đang đc

xét }

1 {Khởi tạo số giả}

A[0]:= -œ { -œ© ký hiệu chỉ số nhỏ hơn mọi phần tử của A}

2 For i:=2 to n do begin

X= Afi]; j:=i-1;

3 {Xác định chỗ cho số mới đang được xét va dịch chuyên các số cần thiết }

While X < A[j] do begin

A[j+I]=All:

J:=J-1

End

23

Trang 23

4 {Đưa X vào đúng chỗ của nó}

A[i+Il=X

End ;

Return

c Sắp xếp kiểu đối chỗ (Giải thuật sắp xếp kiểu nổi bot)

Giải thuật này duyệt từ đáy lên Dọc đường nếu gặp 2 phần tử ngược thứ tự

(Nhia la A[1+1] < A[i] ) Nhu vậy sau lượt đầu phan tử nhỏ nhất của A sẽ ddc

chuyền lên đỉnh Lượt tiếp theo phần tử nhỏ nhất trong (n-1) phần tửu còn lại sẽ đc chuyền lên vị trí thứ 2 Cứ tiếp như vậy sau n-1 lần dãy A sẽ đc sắp xếp theo thứ

Giải thuật nỗi bọt đc sắp sếp như sau:

Procedure Bubble — Sort

1 For i:=1 to n-1 do

2 {Duyệt từ đáy lên}

For j:=n down to i+1 do

3 {Nếu ngược thứ tự thì đổi chỗ }

Tf A[j]< A[j-1] then

Trang 24

Tìm kiếm một phần tử nào đó của một tập đối tượng theo một tiêu trí đã đề ra là

một bài toán rất phố biết trong tin học Ở đây ta xét tới một dạng đơn giản của nó

Cho một vecto A gồm n phần tử có giá trị là các số khác nhau

Function SEQ (A,n,X);

{Thủ tục này sẽ tìm xem trong các phần tử của A có phần tử nào có giá trị bằng

X hay không Nếu có thì nó ghi nhận lại chỉ số của phần tử đó , nếu không thì

nó ghi nhận số 0 Trong thủ tục này người ta đua vào phần tử giả A[n+1] mà giá trị của nó chính là X}

1 {Khởi tọa biên phần tử giả}

E=T?

A[n+Il]:=X;

2 {Tìm kiếm}

Trang 25

While A[i] # X do I:=i+1;

{Thấy hay không thay}

If i:=n+1 then begin

Trong danh sách luôn có phần tửu đầu (Phần tửu thứ nhất) phần tử cuối

(Phần tửu thứ n) Với mỗi phần tử có phần tử trước nó (Trừ phần tử đầu ) và

phần tử sau nó ( trừ phần tủ cuối) Đối với ds thì thường có phép phải bổ

sung thêm phần tử mới loại bỏ đi phần tử cũ ngoài ra có thể còn có các phép

Lưu trữ kế tiếm đối với danh sách

- Cũng như đối với mảng , danh sách có thể được lưu trữ trong bộ nhớ bởi 1 vecto lưu trữ V gồm n ô nhớ kế tiếp Mỗi phần tửu A; của ds A sẽ đc lưu trữ trong một ô nhớ V[ï] (Phần tử thứ I của v) với 1<=I <=n

Lưu trữ móc nối đối với danh sách

3.3.1 Giới thiệu phương pháp

Trang 26

- Mỗi phần tử của ds dược lưu trữ trong một ô nhớ ta gọi là nut

- Méi nit bao gén một số từ máy kế tiếp đủ để lưu trữ thông tin cần thiết đó là

thông tin ứng với mỗi phần tử của ds và đại chỉ nút tiếp theo

+ Trường INFO chứa thông tin ứng với phần tử của ds

+ Trường link chứa địa chỉ của nút tiếp theo

Chú ý: Riêng nut cuối cùng thì không có nút tiếp theo nữa lên đường link

cảu nó phải chứa một địa đặc biệt , chỉ mang tính chất quy ước dùng để đánh

dấu nút kết thúc đs

- Dé truy cập vào 1 nút trong ds thì phải biết được đại chỉ của nút đầu tiên

hay nói một cách khác phải nắm đc con trỏ L trior tới nót đầu tiên này

- _ Ví dụ ta có một ds sau, ta muốn công bố đs đó theo tứ tự từ điển, ta có thể tổ

chức theo kiêu móc nôi như sau:

Trang 27

Mũi tên — : chỉ "mối nối" : địa chỉ nút tiếp theo

Dấu x : chỉ "mối nối không” (địa chỉ null)

Ở đây mối nối đã được thay bằng số thứ tự ( có thể coi đây là đc tương đối), mối nối không đã được ký hiệu bằng số 0 (Không có sft nào bằng 0 cả) Địa chỉ L ở đây bang 8 img véi nút đâu tiên của ds Có thé minh họa bằng hình anh sau:

28

Trang 28

Nút dau tién dau ds này có đại chỉ là § dựa vào đường link ta có thể biết nút tiếp

theo có địa chỉ là 5

Cần chú ý là: Một cách tổng quát thì mỗi bút của đs móc nối có thé nam 6 bat ký

chỗ nào trong bộ nhớ và nhưu vậy địa chỉ nằm ở đường link ở mỗi nút là địa chỉ

thực cảu nút tiếp theo

- Người ta quy ước ds rong là ds không có chứa nút nào Lúc đó L=null

- Nếu P là con trỏ, trỏ đến một nut bat ky trong ds móc nói thì phần thông tin của phần tử tương ứng sẽ đc ký hiệu là Info(p)

- Phần địa chỉ của nút tiếp theo ksy hiệu là Link(p)

Câu lệnh Call new(p): Sẽ cho ta một nút trống với một quy các nhất định

và có địa chỉ p để sử dụng

- Call dispose (p): Tra lai cho ta ds trong rỗng nút có địa chỉ là P

3.3.2 Một số phép toán trên ds móc nối

1 Duyệt qua một ds móc nối

- _ Phép duyệt một ds móc nối là phép thăm từng nút trong ds đó mỗi nút chỉ thăm một lần , ở mỗi nút ta thực hiện một phép sử lý nào đó Bài toán đc

phát biểu như sau;

“ Cho một ds móc nối , con trỏ L trỏ tới nút đầu tiên trong ds hay in lan luot

phần thông tin của từng nút trong ds đó”

- _ Ta dùng một biến p đề ghi nhận địa chỉ của từng nút trong phép duyệt Ban

đầu p lấy giá trị của L, sau đó lần lượt lấy giá trị đại chỉ của các nút tiếp theo

(P được gọi là biến con trỏ)

Procedure travers (L);

1 If L:=Null then return; {nếu ds rỗng thì ko làm gì}

2 P:=L; {p lấy giá trị của L}

3 While p#null do begin

Trang 29

2 Bỗ sung thêm một nút vào ds

Cho một ds móc nối có con trỏ L trỏ tới nút đầu tiên Hãy bổ sung thêm một nút mớ vào trước nút đầu tiên này (Nếu có) Thông tin của nút mới này là A”

Procedure Insert (L,A)

1 {Tạo một nút mới}

Call new(p);

Info(p):=A {Gan A vao trudng info}

Link(p):=L {Gán địa chỉ L vào trường link}

3 Loại bó nút ra khỏi ds móc nối

“Cho đs móc nối với L trỏ vào nút đầu tiên trong ds, giả sử rằng ds nay không

rỗng hãy loại bỏ nút cuối cùng của ds”

Trang 30

-_ Nếu đs chỉ có một nút thì nó cũng là nút cuối cùng và sau phép loại bỏ thì ds trở thành rỗng

-_ Ds có từ 2 nút trở lên thì không những phải tìm đến nút cuối cùng p với đặc điểm nhận biết là Link (p)=Null va phải tìm đến nút đừng trước nút cuối

cùng nữa để sửa mối nối của nút đó Vì vật giải thuật đước đây ta sẽ dùng 2

biến con trỏ để cuối cùng ghi nhận đại chỉ nút cuối danh sách và nút đứng

trước nút cuối cùng này

While Link(p)#null do p:=Link(p);

4, {Tìm kiếm nút đứng trước nút cuối cùng}

While link(q)#p do q:=link(q);

5 {Loại p ra khỏi ds, sửa nút q thành nút cuối của ds}

Call dispose(p);

Link(q):=Null;

6 Return

Ghép hai danh sách móc nối thành một

Cho 2 ds móc nói lần lượt được trỏ bởi P va Q” Biết rằng cả hai ds này đều

ko rỗng và trong đs P có một nút đc trỏ bởi con trỏ T(Có đại chỉ chính là T ) Hãy viết giải thuật chèn ds Q vào sau nút trỏ bởi T (Cuối cùng sẽ được một ds lớn hơn mà con trỏ trỏ tới nút đầu tiên cảu nó van 1a P)”

- Ta có thể hình dung danh sách trước và sau ghép như sau

Ngày đăng: 28/04/2022, 08:17

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm