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 ngành công nghệ thông tin cao đẳng liên thông

70 0 0
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

Tiêu đề Cấu trúc dữ liệu và giải thuật
Tác giả Trần Thỏ MÂ
Trường học Trường Cao đẳng Xây dựng số 1
Chuyên ngành Công nghệ thông tin
Thể loại Giáo trình
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 70
Dung lượng 1,14 MB

Nội dung

+ Sß phần tử biÁn đổi + Mát phần tử th°ờng là mát bÁn ghi record trong Pascal hoặc mát cấu trúc struct trong C - Các thao tác th°ờng sử dụng nhất: + Thêm phần tử + Xóa phần tử - Các thao

Trang 1

Bà XÂY DĀNG

TR¯ÞNG CAO ĐẲNG XÂY DĀNG Sà 1

GIÁO TRÌNH

TRÌNH Đà: CAO ĐÀNG LIÊN THÔNG

Ban hành kèm theo Quyết định số: 374ĐT/QĐ- CĐXD1 ngày 16 tháng 08 năm

2022 cÿa Hiệu trưởng trường CĐXD số 1

Hà Nội, năm 2022

Trang 2

TUYÊN Bà BÀN QUYÀN

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ù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

Trang 3

3

LÞI NÓI ĐÄU

Giáo trình CÀU TRÚC Dþ LIàU VÀ GI¾I THU¾T được biên soạn nhằm

phục vụ cho giảng dạy và học tập cho trình độ Cao đẳng liên thông ngành Công nghá

và giải thuật là môn học cơ sở ngành nhằm cung cấp các kiến thāc cơ bản về các kiểu cấu trúc dữ liệu thông dụng và một số giải thuật trên các kiểu cấu trúc dữ liệu đó trong ngành Công nghệ thông tin

Giáo trình này được viết theo đề cương môn học Cấu trúc dữ liệu và giải thuật Nội dung gồm 04 chương như sau:

Chương 1: Giải thuật

Xin trân trọng cảm ơn!

Hà Nội, ngày……tháng……năm………

Tham gia biên so¿n Trần Thá M¢ - Chủ biên

Trang 4

1.4 Ph°¢ng pháp thiÁt kÁ giÁi thuÁt 12

1.4.1 Phân rã bài toán thành các bài toán nhỏ h¢n 12

2.2.1 Danh sách liên kÁt đ¢n (singly linked list) 21

2.2.3 Danh sách liên kÁt vòng (circular linked list) 29

Trang 5

4.2 Các giÁi thuÁt tìm kiÁm 62

4.2.1 Bài toán tìm kiÁm 62

4.2.2 Tìm kiÁm tuần tā 62

4.2.3 Tìm kiÁm nhá phân 63

4.2.4 Cây nhá phân tìm kiÁm 64

Trang 6

6

Tên môn hác: CÄU TRÚC Dþ LIàU VÀ GIÀI THU¾T Mã môn hác: MH09

Thßi gian thāc hián môn hác: 45 giờ; (Lý thuyÁt: 15 giờ; Thāc hành, thí

nghiệm, thÁo luÁn, bài tÁp: 28 giờ; Kiểm tra: 02 giờ)

II Mÿc tiêu môn hác:

- Về kiÁn thức: Các khái niệm c¢ bÁn về giÁi thuÁt, đánh giá đá phức t¿p của giÁi thuÁt Các kiểu cấu trúc dÿ liệu thông dụng và mát sß giÁi thuÁt trên các kiểu cấu trúc dÿ liệu đó

- Về kỹ năng: ThiÁt kÁ đ°ợc mát sß giÁi thuÁt sÃp xÁp, tìm kiÁm VÁn dụng các kiểu cấu trúc dÿ liệu thông dụng và các giÁi thuÁt để giÁi mát sß bài toán thāc tiễn

- Về năng lāc tā chủ và trách nhiệm: Tích cāc nghiên cứu nhÿng kiÁn thức về cấu trúc dÿ liệu, giÁi thuÁt Rèn luyện ý thức chấp hành kỷ luÁt lao đáng, phát huy tinh thần chủ đáng nghiên cứu, học hỏi, sáng t¿o trong học tÁp và làm việc

Trang 7

7

CH¯¡NG 1: GIÀI THU¾T Mÿc tiêu bài hác

1 Cung cấp cho ng°ời học các kiÁn thức c¢ bÁn về c¢ bÁn về giÁi thuÁt: các đặc tr°ng giÁi thuÁt, ngôn ngÿ diễn đ¿t giÁi thuÁt, ph°¢ng pháp thiÁt kÁ giÁi thuÁt, đánh giá đá phức t¿p của giÁi thuÁt trong mát sß bài toán cụ thể

Trang 8

8

CH¯¡NG 1: GIÀI THU¾T 1.1 Các khái niám

Khái niệm giÁi thuÁt hay thuÁt giÁi mà nhiều khi còn đ°ợc gọi là thuÁt toán dùng để chß ph°¢ng pháp hay cách thức (method) để giÁi quyÁt vần đề GiÁi thuÁt có thể đ°ợc minh họa b¿ng ngôn ngÿ tā nhiên (natural language), b¿ng s¢ đá (flow chart) hoặc b¿ng mã giÁ (pseudo code) Trong thāc tÁ, giÁi thuÁt th°ờng đ°ợc minh họa hay thể hiện b¿ng mã giÁ tāa trên mát hay mát sß ngôn ngÿ lÁp trình nào đó (th°ờng là ngôn ngÿ mà ng°ời lÁp trình chọn để cài đặt thuÁt toán), chÁng h¿n nh° C, Pascal, ? Khi đã xác đánh đ°ợc cấu trúc dÿ liệu thích hợp, ng°ời lÁp trình s¿ bÃt đầu tiÁn hành xây dāng thuÁt giÁi t°¢ng ứng theo yêu cầu của bài toán đặt ra trên c¢ sở của cấu trúc dÿ liệu đã đ°ợc chọn Để giÁi quyÁt mát vấn đề có thể có nhiều ph°¢ng pháp, do vÁy sā lāa chọn ph°¢ng pháp phù hợp là mát việc mà ng°ời lÁp trình phÁi cân nhÃc và tính toán Sā lāa chọn này cũng có thể góp phần đáng kể trong việc giÁm bớt công việc của ng°ời lÁp trình trong phần cài đặt thuÁt toán trên mát ngôn ngÿ cụ thể

Để đánh giá mát cấu trúc dÿ liệu chúng ta th°ờng dāa vào mát sß tiêu chí sau: - Cấu trúc dÿ liệu phÁi tiÁt kiệm tài nguyên (bá nhớ trong)

- Cấu trúc dÿ liệu phÁi phÁn Ánh đúng thāc tÁ của bài toán - Cấu trúc dÿ liệu phÁi dễ dàng trong việc thao tác dÿ liệu

1.2 Các đặc tr°ng cÿa giÁi thu¿t

- Tính xác định: Mßi b°ớc của thuÁt giÁi cần phÁi đ°ợc mô tÁ mát cách chính

xác, chß có mát cách hiểu duy nhất Bởi vì, nÁu mát b°ớc có thể hiểu theo nhiều cách khác nhau, thì cùng mát dÿ liệu vào, nhÿng ng°ời thāc hiện thuÁt giÁi khác nhau có thể cho ra kÁt quÁ khác nhau NÁu ta mô tÁ thuÁt giÁi b¿ng ngôn ngÿ tā nhiên, không có gì đÁm bÁo ng°ời đọc hiểu đúng ý của ng°ời viÁt thuÁt giÁi, bởi ngôn ngÿ tā nhiên th°ờng là đa nghĩa Để đÁm bÁo đòi hỏi này, thuÁt giÁi cần đ°ợc mô tÁ trong mát ngôn ngÿ lÁp trình, chÁng h¿n mát ngôn ngÿ lÁp trình (Pascal, C ) trong các ngôn ngÿ này, các mệnh đề đ°ợc t¿o thành theo các qui tÃc cú pháp nghiêm nghặt và chß có mát ý

nghĩa duy nhất

Trang 9

9

- Tính khả thi: Tất cÁ các phép giÁi có mặt trong các b°ớc của thuÁt giÁi phÁi đủ

đ¢n giÁn Điều đó có nghĩa là các phép giÁi phÁi sao cho, ít nhất về nguyên tÃc có thể thāc hiện đ°ợc bởi con ng°ời trong mát khoÁng thời gian hÿu h¿n ChÁng h¿n trong thuÁt giÁi Euclid, ta chß cần thāc hiện các phép chia các sß nguyên, các phép gán và các phép so sánh

- Tính dừng: Với mọi bá dÿ liệu vào thoÁ mãn điều kiện qui đánh, thuÁt giÁi

phÁi dừng l¿i sau mát sß hÿu h¿n b°ớc thāc hiện ChÁng h¿n đßi với thuÁt giÁi Euclid là thuÁt giÁi thoÁ mãn điều kiện này Bởi vì sß d° r luôn nhỏ h¢n n, nÁu r0 thì giá trá của n ở b°ớc sau là giá trá của r ở b°ớc tr°ớc, ta có n>r=n1>r1=n2>r2 Dãy sß nguyên d°¢ng giÁm dần cần phÁi kÁt thúc ở 0, do đó sau mát sß b°ớc giá trá của r=0 thuÁt giÁi dừng

1.3.1 Ngôn ngÿ thông thường

Trong cách biểu diễn thuÁt giÁi theo ngôn ngÿ tā nhiên, ng°ời ta sử dụng ngôn ngÿ th°ờng ngày để liệt kê các b°ớc của thuÁt giÁi (Các ví dụ về thuÁt giÁi trong mục 1 của ch°¢ng sử dụng ngôn ngÿ tā nhiên) Ph°¢ng pháp biểu diễn này không yêu cầu ng°ời viÁt thuÁt giÁi cũng nh° ng°ời đọc thuÁt giÁi phÁi nÃm các quy tÃc Tuy vÁy, cách biểu diễn này th°ờng dài dòng, không thể hiện rõ cấu trúc của thuÁt giÁi, đôi lúc gây hiểu lầm hoặc khó hiểu cho ng°ời đọc Gần nh° không có mát quy tÃc cß đánh nào trong việc thể hiện thuÁt giÁi b¿ng ngôn ngÿ tā nhiên

1.3.2 Lưu đồ

L°u đá hay s¢ đá khßi là mát công cụ trāc quan để diễn đ¿t các thuÁt giÁi Biểu diễn thuÁt giÁi b¿ng l°u đá s¿ giúp ng°ời đọc theo dõi đ°ợc sā phân cấp các tr°ờng hợp và quá trình xử lý của thuÁt giÁi Ph°¢ng pháp l°u đá th°ờng đ°ợc dùng trong nhÿng thuÁt giÁi có tính rÃc rßi, khó theo dõi đ°ợc quá trình xử lý

Các nút biểu diễn giải thuật bằng sơ đồ khối:

Nút thao tác

Nút điều khiển: trong đó ghi điều kiện cần kiểm tra trong quá

trình tính toán

Trang 10

10 Nút khởi đầu, kÁt thúc

Cung V¿ l°u đá hoặc s¢ đá khßi, mßi khßi mô tÁ mát b°ớc Sử dụng mũi tên nßi khßi này với khßi kia để chß trình tā thāc hiện các b°ớc Để dễ dàng nhÁn biÁt chức năng của từng khßi, mßi khßi đ°ợc thể hiện ở mát d¿ng nh° sau:

Ví dụ: Tìm nghiệm thāc của ph°¢ng trình bÁc hai ax2+bx+c=0 ThuÁt toán gám các b°ớc sau:

+ NhÁp dÿ liệu a, b, c + Tính biệt sß  = b2-4ac + So sánh  với 0 B°ớc tiÁp theo s¿ phụ thuác vào giá trá của  + NÁu <0, đáp sß của bài toán là <Vô nghiệm=

+ NÁu >0, tính và ghi đáp sß trá của hai nghiệm phân biệt:

L°u đá biểu diễn thuÁt toán này đ°ợc thể hiện nh° sau:

Trang 11

11

Tuy s¢ đá khßi thể hiện rõ quá trình xử lý và sā phân cấp các tr°ờng hợp của thuÁt toán nh°ng l¿i cáng kềnh Để mô tÁ mát thuÁt toán nhỏ ta phÁi dùng mát không gian rất lớn Đôi khi, ta có thể thể hiện thuÁt toán b¿ng ngôn ngÿ lÁp trình nào đó Mọi ngôn ngÿ lÁp trình đều có nhÿng thao tác c¢ bÁn là xử lý, r¿ nhánh và lặp Nh° vÁy, có thể tÁn dụng đ°ợc các khái niệm trong ngôn ngÿ lÁp trình, vừa giúp ng°ời cài đặt dễ dàng hiểu chính xác thuÁt toán Mát khi đã vay m°ợn cú pháp và khái niệm của ngôn ngÿ lÁp trình thì chÃc chÃn mã giÁ s¿ bá phụ thuác vào ngôn ngÿ lÁp trình đó

Mát đo¿n mã giÁ của thuÁt toán giÁi ph°¢ng trình bÁc hai:

if Delta > 0 then begin

end else if delta = 0 then xuất kết quả : phương trình có nghiệm kép là -b/(2*a) else {trường hợp delta < 0 }

xuất kết quả : phương trình vô nghiệm x1=(-b+sqrt(delta))/(2*a)

x2=(-b-sqrt(delta))/(2*a)

Trang 12

12

xuất kết quả : phương trình có hai nghiệm là x1 và x2

1.4 Ph°¢ng pháp thi¿t k¿ giÁi thu¿t

Các bài toán giÁi trên máy tính càng ngày càng đa d¿ng và phong phú d¿n tới quy mô ch°¢ng trình ngày càng lớn Quy mô càng lớn d¿n tới việc lÁp và kiểm soát ch°¢ng tình càng gặp nhiều khó khăn h¢n

Ta cần chia bài toán lớn thành nhiều bài toán nhỏ, do đó ng°ời ta sử dụng mát ph°¢ng pháp thiÁt kÁ:

Từ trên xuống (top)-down design: Phân tích tổng quát toàn bá vấn đề và mục

tiêu đặt ra, đề cÁp tới nhÿng công việc chủ yÁu, sau đó dần giÁi quyÁt các phần việc cụ thể mát cách chi tiÁt h¢n

Ví dụ: Cần lÁp mát hệ ch°¢ng trình quÁn lý bÁo trì há s¢ về l°¢ng của cán bá Ch°¢ng trình đ°ợc phân tích theo s¢ đá sau:

¯u điểm cho ph°¢ng pháp thiÁt kÁ từ trên xußng: - Giúp cho việc giÁi quyÁt bài toán đ°ợc đánh h°ớng rõ ràng, tránh sa đà vào các chi tiÁt phụ

- Cho phép tách bài toán thành các thành phần đác lÁp, mßi phần có thể đ°ợc giao cho các nhóm lÁp trình khác nhau Các nhóm làm việc đác lÁp với nhau

- Thấy cấu trúc rõ ràng của ch°¢ng trình, từ đó có thể dễ dàng hiểu, nÃm vÿng và bao quát ch°¢ng trình, việc tìm và sửa lßi cũng trở nên dễ dàng h¢n

1.4.2 Phương pháp tinh chỉnh từng bước

Ph°¢ng pháp tinh chßnh từng b°ớc là ph°¢ng pháp thiÁt kÁ giÁi thÁt gÃn liền với lÁp trình

Ví dụ: LÁp ch°¢ng trình sÃp xÁp mát dãy sß gám n sß nguyên theo thứ tā tăng dần

Các b°ớc tinh chßnh s¿ nh° sau:

Trang 13

13

1 Readln(n) 2 Lần lượt nhập các số a1, a2, , an 3 For i:=1 to n do

Begin - Tìm số nhỏ nhất a_min trong dãy ai, ai+1, , an

- đổi chỗ a_min với ai End

Tới đây ta thấy trong phần 3 chß có 2 nhiệm vụ cần làm rõ: Tìm sß nhỏ nhất a_min

đổi chß a_min với ai Sß nhỏ nhất đ°ợc xác đánh b¿ng cách chß ra vá trí của nó, tức là xác đánh chß sß của nó Việc này đ°ợc thāc hiện b¿ng cáh luôn ghi nhớ chß sß của Sß nhỏ nhất vào 1 biÁn, cụ thể là:

min:=i; For k:=i+1 to n do If ai < amin then min:=k;

Việc đổi chß a_min với ai đ°ợc thāc hiện gißng nhau nh° khi ta mußn chuyển 2 thứ n°ớc trong 2 chai từ chai nọ sang chai kia, ta dùng 1 chai thứ 3 làm trung gian

tg:=ai; a:=amin; amin:=tg;

Sau khi tinh chßnh lần 2, ch°¢ng trình có d¿ng:

1 Readln(n) 2 Lần lượt nhập các số a1, a2, , an 3 For i:=1 to n do

Begin 3.1 min:=i; For k:=i+1 to n do If a[k] < a[min] then min:=k; 3.2 tg:=a[i];

a[i]:=a[min]; a[min]:=tg; End

Trang 14

14

Há tháng ki¿n thāc ch°¢ng 1

1 Yêu cÅu vÁ lý thuy¿t

- KiÁn thức c¢ bÁn về giÁi thuÁt: các đặc tr°ng giÁi thuÁt, ngôn ngÿ diễn đ¿t giÁi thuÁt, ph°¢ng pháp thiÁt kÁ giÁi thuÁt, đánh giá đá phức t¿p của giÁi thuÁt trong mát sß bài toán cụ thể

2 Yêu cÅu vÁ bài t¿p: Làm bài tÁp của ch°¢ng 1 3 Há tháng các ki¿n thāc đã hác:

- Tổng quan về giÁi thuÁt:

+ Các đặc tr°ng của giÁi thuÁt + Ngôn ngÿ diễn đ¿t giÁi thuÁt + Ph°¢ng pháp thiÁt kÁ giÁi thuÁt + Đánh giá đá phức t¿p của giÁi thuÁt trong mát sß bài toán

4 Các câu hßi, bài t¿p ch°¢ng 1:

Câu hỏi 1: GiÁi thuÁt là gì? Nêu các đặc tr°ng của giÁi thuÁt? Câu hỏi 2: Kể tên nhÿng lo¿i ngôn ngÿ nào diễn đ¿t giÁi thuÁt? Bài tÁp 1: ViÁt giÁi thuÁt xác đánh n là sß nguyên tß?

Bài tÁp 2: GiÁi thuÁt tìm phần tử thứ n của dãy sß Fibonacci

Trang 15

15

CH¯¡NG 2: DANH SÁCH Mÿc tiêu bài hác

1 Cung cấp cho ng°ời học các kiÁn thức c¢ bÁn về mát sß kiểu dÿ liệu d¿ng danh sách và mát sß thao tác trên kiểu dÿ liệu đó

Trang 16

16

CH¯¡NG 2: DANH SÁCH

Danh sách là tÁp hợp các phần tử có kiểu dÿ liệu xác đánh và giÿa chúng có mát mßi liên hệ nào đó Sß phần tử của danh sách gọi là chiều dài của danh sách Mát danh sách có chiều dài b¿ng 0 là mát danh sách rßng

+ Sß phần tử biÁn đổi + Mát phần tử th°ờng là mát bÁn ghi (record trong Pascal) hoặc mát cấu trúc (struct trong C)

- Các thao tác th°ờng sử dụng nhất:

+ Thêm phần tử + Xóa phần tử - Các thao tác khác:

+ Tìm kiÁm + Ghép 2 danh sách + Tách 1 danh sách thành nhiều danh sách + Sao chép danh sách

+ Duyệt các phần tử dễ dàng sử dụng chß sß:

for(i = 0; i <= N; ++i) if(a[i]) …

- Nh°ợc điểm:

+ Thêm và xóa KHÔNG dễ dàng + Danh sách th°ờng xuyên thêm bớt phần tử => Không biÁt tr°ớc sß phần tử

Trang 17

17 + Tßn bá nhớ vì phÁi cấp phát nhiều h¢n cần thiÁt để giÿ chß - Thêm mát phần tử thứ i vào mÁng

+ Chuyển các phần tử từ I đÁn n xußng các vá trí từ i+1 đÁn n+1; + Thêm phần tử cần thêm vào vá trí thứ i

+ Xóa phần tử thứ i khỏi mÁng + Chuyển các phần tử từ i+1 đÁn n vào các vá trí từ i đÁn n-1: Không hiệu quÁ vì luôn phÁi dách chuyển phần tử

Ngăn xÁp (stack) là mát cấu trúc dÿ liệu tuyÁn tính, ho¿t đáng theo c¢ chÁ LIFO (Last In First Out), t¿m dách là <vào sau ra tr°ớc= Có nghĩa là phần tử nào đ°ợc thêm vào sau trong stack thì s¿ đ°ợc lấy ra tr°ớc

Trang 18

18

đ°ợc thāc hiện t¿i mát phía của nó Phía này đ°ợc gọi là đßnh của ngăn xÁp

- Trong tin học, mát ngăn xÁp là là mát danh sách tuyÁn tính mà các tác đáng vào nó chß đ°ợc thāc hiện t¿i mát phía của nó Phía này đ°ợc gọi là đßnh của ngăn xÁp

Ta hình dung ngăn xÁp nh° mát ngăn kéo đāng tài liệu (của mát bàn làm việc) mà ta chß có thể thêm vào hoặc bớt đi các phần tử (tài liệu) trong đó từ mặt trên (đßnh) của ngăn kéo; Đo¿n đÁo chiều toa xe lửa; Háp băng đ¿n của súng AK hay mát cháng các đá vÁt cùng kiểu (sách, bát, áo, đáng xu, háp đ¿n súng máy AK47)

Vì vÁy mà có tên gọi Stack (danh sách kiểu xÁp cháng) Với kiểu ngăn xÁp, ta chß có thể thāc hiện các thao tác sau: + Khởi t¿o mát ngăn xÁp

+ Đẩy (push) mát phần tử mới vào ngăn xÁp nÁu ngăn xÁp ch°a đầy Phần tử dÿ liệu mới luôn đ°ợc thêm t¿i đßnh

+ Lấy (pop) mát phần tử ra khỏi ngăn xÁp nÁu ngăn xÁp khác rßng Phần tử bá lo¿i là phần tử đang n¿m t¿i đßnh

+ Kiểm tra xem ngăn xÁp có hay không có phần tử (rßng hay không) + Kiểm tra xem ngăn xÁp đã đầy hay ch°a

Nh° vÁy:

- Các phần tử của ngăn xÁp có cùng mát kiểu nào đó - Ngăn xÁp là mát tr°ờng hợp riêng của danh sách, đ°ợc sử dụng trong các ứng dụng có liên quan đÁn sā đÁo ng°ợc Trong CTDL ngăn xÁp, việc thêm hay lấy dÿ liệu chß đ°ợc thāc hiện t¿i mát đầu Dÿ liệu thêm vào sau s¿ lấy ra tr°ớc, tính chất này còn đ°ợc gọi là vào sau ra tr°ớc (Last In First Out -LIFO)

- Khi nói đÁn ngăn xÁp ta hiểu đó là danh sách kiểu LIFO ❖ Ví dụ: Đổi mát sß nguyên d°¢ng, chÁng h¿n 23, sang c¢ sß 2, ta thāc hiện nh° sau:

Trang 19

19

2.1.4 Kiểu hàng đợi

Mát hàng đợi (queue) là mát mô hình (c¢ cấu) mà tác đáng bổ sung vào nó đ°ợc thāc hiện ở mát phía của nó và tác đáng lo¿i bỏ mát phần tử đ°ợc thāc hiện ở phía còn l¿i

Trong tin học, mát hàng đợi là mát danh sách tuyÁn tính mà thao tác bổ sung chß đ°ợc thāc hiện ở mát đầu và thao tác bớt đi đ°ợc thāc hiện ở phía còn l¿i của nó

Ta hình dung hàng đợi nh° mát dãy ng°ời xÁp hàng t¿i mát quầy hàng để mua mát mặt hàng nào đó mà chß có thể thêm vào hàng đợi từ cußi và bớt đi phần tử ở đầu của hàng đợi; Mát dãy các công việc trong mát hệ thßng máy tính đang chờ mát thiÁt bá nào đó (chÁng h¿n nh° máy in) hoặc mát dãy máy bay đang trong đ°ờng d¿n ra đ°ờng băng để chuẩn bá cất cánh

Hàng đợi là mát cấu trúc dÿ liệu trừu t°ợng, là mát danh sách tuyÁn tính Tuy nhiên điểm khác căn bÁn, có thể xem nh° đßi lÁp với ngăn xÁp là trong khi ngăn xÁp ho¿t đáng theo nguyên lý vào sau - ra tr°ớc (LiFo Last in - First out) thì hàng đợi ho¿t đáng theo nguyên lý vào tr°ớc - ra tr°ớc (FiFo First in - First out)

Với kiểu hàng đợi, ta quy °ớc chß có thể thāc hiện các thao tác sau: + Khởi t¿o mát hàng đợi

Trang 20

20 + Đặt (put) mát phần tử mới vào hàng đợi nÁu hàng đợi ch°a đầy Phần tử dÿ liệu mới luôn đ°ợc thêm t¿i đuôi

+ NhÁn l¿i (get) mát phần tử từ hàng đợi nÁu hàng đợi khác rßng Phần tử bá lo¿i là phần tử đang n¿m t¿i đầu

+ Kiểm tra xem hàng đợi có hay không có phần tử (rßng hay không) + Kiểm tra xem hàng đợi đã đầy hay ch°a

 Mọi tác đáng khác vào hàng đợi đều phÁi thông qua các thao tác này Nh° vÁy:

+ Các phần tử của hàng đợi có cùng mát kiểu nào đó + Hàng đợi là mát tr°ờng hợp riêng của danh sách, đ°ợc sử dụng trong các ứng dụng có liên quan đÁn sā bâor tán thứ tā Trong CTDL hàng đợi, dÿ liệu thêm vào tr°ớc s¿ lấy ra tr°ớc, tính chất này còn đ°ợc gọi là vào tr°ớc ra tr°ớc (First In First Out -FIFO)

 Vì vÁy, khi nói đÁn hàng đợi ta hiểu đó là danh sách kiểu FIFO Thāc hiện mô hình hóa hàng đợi:

có thể làm việc với danh sách này với t° cách là mát hàng đợi

trúc dÿ liệu đ°ợc sử dụng và các đßi t°ợng làm đầu và đuôi của hàng đợi Do đó có thể chọn danh sách liên kÁt đ¢n với mát con trỏ đÁn đầu danh sách và mát con trỏ trỏ đÁn cußi (đuôi) hoặc mÁng mát chiều với hai tham sß nguyên chß vá trí đầu và đuôi của hàng đợi

thāc tÁ của hàng đợi

tác hàng đợi bao gám 5 thao tác đã nói ở trên

2.2 Danh sách liên k¿t

nhau thông qua vùng liên kÁt của chúng Sā nßi kÁt giÿa các phần tử trong danh sách liên kÁt đó là sā quÁn lý, ràng buác l¿n nhau về nái dung của phần tử này và đáa chß đánh vá phần tử kia Tùy thuác vào mức đá và cách thức nßi kÁt mà danh sách liên kÁt có thể chia ra nhiều lo¿i khác nhau:

- Danh sách liên kÁt đ¢n (singly linked list); - Danh sách liên kÁt đôi/kép (doubly linked list); - Danh sách liên kÁt vòng (vòng đ¢n, vòng đôi) (circular linked list)

các thao tác trên đó

mát chußi các node kÁt nßi với nhau Mßi node có thể xem nh° mát phần tử trong

Trang 21

21 danh sách Mßi node s¿ l°u trÿ dÿ liệu (data) của node đó và đáa chß (address) của node kÁ tiÁp Bên d°ới là minh họa cấu trúc dÿ liệu danh sách liên kÁt

Danh sách liên kÁt phÁi có node bÃt đầu, đ°ợc gọi là HEAD Node cußi cùng đ°ợc gọi là TAIL Mßi node có nhiều nhất 1 phần tử đứng tr°ớc cũng nh° có nhiều nhất 1 phần tử đứng sau

Có nhiều tr°ờng hợp trong thāc tÁ có thể đ°ợc l°u trÿ b¿ng cách sử dụng Linked List nh°:

+ Danh sách học sinh + Danh mục sách trong th° viện + Danh b¿ điện tho¿i

+ Danh sách các nhân viên trong công ty

2.2.1 Danh sách liên kết đơn (singly linked list)

Danh sách liên kÁt đ¢n (singly linked list) có đặc điểm là mßi node (phần tử) chß liên kÁt với node đứng sau nó trong danh sách

Mßi node trong danh sách liên kÁt gám 2 phần: Phần dÿ liệu (data) dùng để l°u nái dung của node Phần đáa chß liên kÁt (address), th°ờng ký hiệu là next, là các con trỏ có cùng kiểu với node Các con trỏ này l°u trÿ đáa chß của node kÁ tiÁp trong danh sách NÁu là node cußi cùng thì con trỏ trỏ đÁn NULL

Có thể sử dụng kiểu dÿ liệu cấu trúc (struct) để xây dāng mát node nh° sau: struct node{

}; <Kiểu dÿ liệu> trong mát node của danh sách liên kÁt đ¢n có thể là mát kiểu bất kỳ nh° int, float, pointer, struct,&

Có nhiều thao tác trên danh sách liên kÁt đ¢n nh° thêm node, hủy node, tìm kiÁm node trong danh sách, sÃp xÁp danh sách,&

a Định nghĩa danh sách liên kết đơn

GiÁ sử, chúng ta t¿o mát danh sách liên kÁt đ¢n l°u trÿ mát dãy sß nguyên nh° sau:

struct node{

int info;

Trang 22

22 node *next;

}; struct sList{

node *head;

};

b Khởi tạo một danh sách liên kết đơn rỗng

Xây dāng hàm createList() để gán các con trỏ head và tail trỏ về NULL void createsList(sList &l){

l.head = NULL; l.tail = NULL; }

c Tạo một node và gán giá trị cho node

Xây dāng hàm createNode() có tham sß là giá trá của node mußn t¿o Hàm createNode() có kiểu trÁ về là con trß node

node* createNode(int x){

node *p; p = new node; if(p==NULL){

cout<<"Khong du bo nho!"; exit(1);

} p->info = x; p->next = NULL; return p;

}

d Thêm một node vào danh sách

 Thêm một node vào đÅu danh sách:

Tr°ờng hợp 1: NÁu danh sách liên kÁt đ¢n rßng thì node mới đ°ợc xem là node đầu tiên và cũng là node cußi cùng

Tr°ờng hợp 2: NÁu danh sách liên kÁt đ¢n không rßng thì:

+ Cho con trỏ liên kÁt (next) của node mới trỏ vào node đầu tiên trong danh sách hiện t¿i

+ Cho con trỏ đầu của danh sách liên kÁt đ¢n (*head) trỏ vào node mới void insertHead(sList &l, int x){

node *p; p = createNode(x); if(p==NULL){

Trang 23

23 cout<<"Khong tao duoc node!"; exit(1);

} if(l.head==NULL){//trường hợp danh sách rỗng

l.head = l.tail = p; }else{//trường hợp danh sách không rỗng

p->next = l.head; l.head = p;

} }

 Thêm một node vào cuái danh sách:

Tr°ờng hợp 1: NÁu danh sách liên kÁt đ¢n rßng thì node mới đ°ợc xem là node đầu tiên và cũng là node cußi cùng

Tr°ờng hợp 2: NÁu danh sách liên kÁt đ¢n không rßng thì:

+ Cho con trỏ liên kÁt (next) của node cußi danh sách hiện t¿i trỏ đÁn đÁn node mới

+ Cho con trỏ cußi của danh sách liên kÁt đ¢n (*tail) trỏ vào node mới

void insertTail(sList &l, int x){

node *p = createNode(x); if(p==NULL){

cout<<"Khong tao duoc nut moi!"; exit(1);

} if (l.head==NULL){//trường hợp danh sách rỗng

l.head = l.tail = p ; }else{//trường hợp danh sách không rỗng

l.tail->next = p; l.tail = p;

} }

 Thêm một node p vào sau một node q trong danh sách:

- Cho con trỏ liên kÁt (next) của node p chß vào node sau của q - Cho con trỏ liên kÁt của q chß vào node p

- NÁu q là nút cußi thì gán l¿i p là nút cußi

Trang 24

24

void insertAfter(sList &l, node *p, node *q){

p->next = q->next; q->next = p;

if (q == l.tail){

l.tail = p; }

}

e Duyệt các phần tử trong danh sách

 Duyát toàn bộ danh sách:

void processList(sList &l){

node *p; p = l.head; while (p!= NULL){

cout<<p->info<<endl;//xuất giá trị trong node p = p->next;

} }

 Tìm ki¿m node có giá trß k trong danh sách:

Hàm searchList() có kiểu trÁ về là con trỏ node NÁu tìm thÃy x thì node đ°ợc

trÁ về khác NULL, ng°ợc l¿i node đ°ợc trÁ về là NULL

node* searchList(sList l, int k){

node *p; p = l.head; while((p!= NULL)&&(p->info != k)){

p = p->next; }

return p; }

Trang 25

25

 Hÿy toàn bộ danh sách:

Sử dụng lệnh delete để giÁi phóng bá nhớ l°u trÿ các node trong danh sách

void deleteList(sList &l){

node *p; while (l.head!= NULL){

p = l.head; l.head = p->next; delete p;

} l.tail = NULL; }

f Sắp xếp các node trong danh sách

Có thể sử dụng thuÁt toán sÃp xÁp chán trāc ti¿p (Selection Sort) để sÃp xÁp

danh sách liên kÁt đ¢n

void List_Selection_Sort(sList &l){

node *min; node *p, *q; p = l.head; while(p != l.tail){

min = p; q = p->next; while(q != NULL){

if(q->info < min->info){

min = q; }

q= q->next; }

swap(min->info, p->info); p = p->next;

} }

2.2.2 Danh sách liên kÁt kép (doubly linked list)

Danh sách liên kÁt kép (doubly linked list) có đặc điểm là mßi phần tử liên kÁt với phần tử đứng tr°ớc và đứng sau nó trong danh sách

GiÁ sử, chúng ta t¿o ra mát danh sách liên kÁt kép l°u trÿ mát dãy sß nguyên nh° sau:

struct dNode{

int info;

Trang 26

26

struct dNode *pre; struct dNode *next; };

struct dList{

dNode *head; dNode *tail; };

Mßi node có thêm mát con trỏ *pre để l°u trÿ đáa chß của node đứng tr°ớc nó Đó là sā khác biệt lớn nhất của danh sách liên kÁt kÁp so với danh sách liên kÁt đ¢n

Các thao tác c¢ bÁn trên danh sách liên kÁt kép: Cũng gißng nh° danh sách liên kÁt đ¢n, danh sách liên kÁt kép cũng có nhÿng thao tác c¢ bÁn nh° là thêm node, hủy node, duyệt danh sách, sÃp xÁp node,&

a Tạo một danh sách liên kết kép rỗng

void createsList(dList &l){

l.head = NULL; l.tail = NULL; }

b Tạo một node và gán giá trị cho node

dNode* createdNode(int x){

dNode *p; p = new dNode; if(p==NULL){

cout<<"khong con du bo nho"; exit(1);

}else{

p->info=x; p->next=NULL; p->pre=NULL; return p; }

}

c Thêm một node vào đầu danh sách

void insertHead(dList &l, int x){

dNode *p; p = createdNode(x); if(p==NULL){

cout<<"Khong tao duoc node!"; exit(1);

Trang 27

27

} if(l.head==NULL){//trường hợp danh sách rỗng

l.head = p; l.tail = l.head; }else{//trường hợp danh sách không rỗng

p->next = l.head; l.head->pre = p; l.head = p;

} }

d Thêm một node vào cuối danh sách

void insertTail(dList &l, int x){

dNode *p = createdNode(x); if(p==NULL){

cout<<"Khong tao duoc nut moi!"; exit(1);

} if (l.head==NULL){//trường hợp danh sách rỗng

l.head = p; l.tail = l.head; }else{//trường hợp danh sách không rỗng

p->pre=l.tail; l.tail->next=p; l.tail=p;

} }

e Duyệt các phần tử trong danh sách

void processList(dList &l){

dNode *p; p = l.head; while (p!= NULL){

cout<<p->info<<endl;//xuất giá trị trong node p = p->next;

} }

f Hÿy node đầu tiên trong danh sách

void DeleteFirst(dList &l){

dNode *p; if(l.head!=NULL){

Trang 28

28

p=l.head; l.head=l.head->next; l.head->pre=NULL; delete p;

if(l.head==NULL){

l.tail=NULL; }

} }

g Hÿy node cuối cùng trong danh sách void DeleteEnd(dList &l ){

dNode *p; if(l.head!=NULL){

p=l.tail; l.tail=l.tail->pre; l.tail->next=NULL; delete p;

if(l.tail==NULL){

l.head=NULL; }

} }

h Hÿy toàn bộ danh sách

void deleteList(dList &l){

dNode *p; while (l.head!= NULL){

p = l.head; l.head = l.head->next; delete p;

} l.tail = NULL; }

i Sắp xếp các node trong danh sách

void List_Interchange_Sort(dList &l){

dNode *p,*q; p=l.head; while(p!=l.tail){

q=p->next; while(q!=NULL){

Trang 29

29

if(p->info>q->info){

swap(p->info, q->info); }

q=q->next; }

p=p->next; }

}

2.2.3 Danh sách liên kết vòng (circular linked list)

Đặc điểm của Circular Linked List là phần tử cußi danh sách liên kÁt với phần tử đầu danh sách Có 2 lo¿i danh sách liên kÁt vòng là:

- Danh sách liên kÁt đ¢n vòng:

- Danh sách liên kÁt đôi vòng:

¯u điểm của danh sách liên kÁt vòng là bất kỳ nút nào cũng có thể coi là đầu của danh sách Có nghĩa là từ mát nút bất kì, ta có thể tiÁn hành duyệt qua toàn bá các phần tử của danh sách mà không cần trở về nút đầu tiên nh° trong danh sách liên kÁt thông th°ờng

Tuy nhiên, nh°ợc điểm của danh sách lo¿i này là có thể không biÁt khi nào thì đã duyệt qua toàn bá phần tử của danh sách Điều này d¿n đÁn 1 quá trình duyệt vô h¿n, không có điểm dừng Để khÃc phục nh°ợc điểm này, trong quá trình duyệt luôn phÁi kiểm tra xem đã trở về nút ban đầu hay ch°a Việc kiểm tra này có thể dāa trên giá trá phần tử hoặc b¿ng cách thêm vào 1 nút đặc biệt

Trang 30

30

Há tháng ki¿n thāc ch°¢ng 2

1 Yêu cÅu vÁ lý thuy¿t

trên kiểu dÿ liệu đó

2 Yêu cÅu vÁ bài t¿p: Làm bài tÁp của ch°¢ng 2 3 Há tháng các ki¿n thāc đã hác:

- Mát sß kiểu dÿ liệu d¿ng danh sách:

+ Danh sách tuyÁn tính + Kiểu mÁng

+ Kiểu ngăn xÁp + Kiểu hàng đợi + Danh sách liên kÁt

4 Các câu hßi, bài t¿p ch°¢ng 2:

Câu hỏi 1: Nêu °u và nh°ợc điểm của dÿ liệu kiểu mÁng? Câu hỏi 2: Nêu °u và nh°ợc điểm của dÿ liệu kiểu ngăn xÁp? Câu hỏi 3: Nêu °u và nh°ợc điểm của dÿ liệu kiểu hàng đợi? Câu hỏi 4: Sā khác biệt giÿa ngăn xÁp và hàng đợi là gì? Câu hỏi 5: Nêu °u và nh°ợc điểm của dÿ liệu kiểu danh sách liên kÁt? Bài tÁp 1: Đánh nghĩa cấu trúc danh sách liên kÁt đ¢n sinh viên, mßi sinh viên có các thông tin: mã SV, họ tên, năm sinh, điểm trung bình Sau đó, viÁt ch°¢ng trình thāc hiện các thao tác sau:

a NhÁp, xuất danh sách sinh viên b Xuất danh sách sinh viên có ĐTB>=5 c SÃp xÁp DS sinh viên giÁm dần theo điểm d SÃp xÁp DS sinh viên tăng dần theo mã SV e Tìm kiÁm sinh viên theo mã sß / theo họ tên f Thêm 1 sinh viên

g Xóa 1 sinh viên (nhÁp vào mã sß, tìm và xóa theo mã SV) Bài tÁp 2: Bên d°ới là hình minh họa mát danh sách liên kÁt đ¢n

Hãy viÁt ch°¢ng trình với C để thao tác với danh sách liên kÁt đ¢n ở trên:

a T¿o danh sách liên kÁt đ¢n nh° hình minh họa b Thêm mát node có giá trß là 9 vào đầu danh sách

c Xuất giá trá và đáa chß của các node trong danh sách lên màn hình d SÃp xÁp danh sách theo thứ tā tăng dần các giá trá của các node

Trang 31

31 e GiÁi phóng bá nhớ cho toàn bá danh sách Bài tÁp 3: Bên d°ới là hình minh họa mát danh sách liên kÁt kép

Hãy viÁt ch°¢ng trình với C với các yêu cầu trên danh sách liên kÁt kép ở trên:

a T¿o danh sách liên kÁt kép nh° hình minh họa b Thêm mát node có giá trá là 9 vào đầu danh sách c Xuất giá trá và đáa chß của các node trong danh sách lên màn hình d SÃp xÁp danh sách theo thứ tā tăng dần các giá trá của các node e GiÁi phóng bá nhớ cho toàn bá danh sách

Trang 33

3.1.1 Định nghĩa

- Mát nút đ¢n đác là mát cây Nút này cũng chính là nút gßc của cây - GiÁ sử ta có n là mát nút đ¢n đác và k cây T1, , Tk với các nút gßc t°¢ng ứng là n1, , nk thì có thể xây dāng mát cây mới b¿ng cách cho nút n là cha của các nút: n1, , nk Cây mới này có nút gßc là nút n và các cây T1, , Tk đ°ợc gọi là các cây con TÁp rßng cũng đ°ợc coi là mát cây và gọi là cây rßng kí hiệu

Thứ tā các nút trong cây: NÁu ta phân biệt thứ tā các nút con của cùng mát nút thì cây gọi là cây có thứ tā, thứ tā qui °ớc từ trái sang phÁi Nh° vÁy, nÁu kể thứ tā thì hai cây sau là hai cây khác nhau:

Cây nhá phân là cây rßng hoặc là cây mà mßi nút có tßi đa hai nút con H¢n nÿa các nút con của cây đ°ợc phân biệt thứ tā rõ ràng, mát nút con gọi là nút con trái và mát nút con gọi là nút con phÁi Ta qui °ớc v¿ nút con trái bên trái nút cha và nút con phÁi bên phÁi nút cha, mßi nút con đ°ợc nßi với nút cha của nó bởi mát đo¿n thÁng

Ví dụ:

Chú ý r¿ng, trong cây nhá phân, mát nút con chß có thể là nút con trái hoặc nút con phÁi, nên có nhÿng cây có thứ tā gißng nhau nh°ng là hai cây nhá phân khác nhau Ví dụ ở trên cho thấy hai cây có thứ tā gißng nhau nh°ng là hai cây nhá phân khác

Trang 34

34 nhau Nút 2 là nút con trái của cây a/ nh°ng nó là con phÁi trong cây b/ T°¢ng tā nút 5 là con phÁi trong cây a/ nh°ng nó là con trái trong cây b/

❖ Tính chất của cây nhá phân: Gọi h và n lần l°ợt là chiều cao và sß phần tử của cây nhá phân Ta có các tính chất sau:

+ Sß nút ở mức i<=2i+1 Do đó sß nút tßi đa của nó là 2h-1 - Sß nút tßi đa trong cây nhá phân là 2h-1, hay n<=2h-1 Do đó chiều cao của nó: n>=h>=log2(n+1)

❖ Biểu diễn cây nhá phân:

Ta chọn cấu trúc đáng để biểu diễn cây nhá phân:

Trong đó: Lchild, Rchild lần l°ợt là các con trỏ chß đÁn nút con bên trái và nút con bên phÁi Nó s¿ b¿ng rßng nÁu không có nút con

Có nhiều thao tác trên cây nhá phân nh°:

+ Chèn mát nút mới vào cây nhá phân + Xóa mát nút ra khỏi cây nhá phân + Duyệt cây nhá phân

+ Tìm kiÁm trên cây nhá phân + &

❖ Duyệt cây nhá phân:

Ta có thể áp dụng các phép duyệt cây tổng quát để duyệt cây nhá phân Tuy nhiên vì cây nhá phân là cấu trúc cây đặc biệt nên các phép duyệt cây nhá phân cũng đ¢n giÁn h¢n Có ba cách duyệt cây nhá phân th°ờng dùng:

- Duyệt tiền tā (Node-Left-Right): duyệt nút gßc, duyệt tiền tā con trái rái duyệt tiền tā con phÁi

- Duyệt trung tā (Left-Node-Right): duyệt trung tā con trái rái đÁn nút gßc sau đó là duyệt trung tā con phÁi

- Duyệt hÁu tā (Left-Right-Node): duyệt hÁu tā con trái rái duyệt hÁu tā con phÁi sau đó là nút gßc

Chú ý r¿ng danh sách duyệt tiền tā, hÁu tā của cây nhá phân trùng với danh sách duyệt tiền tā, hÁu tā của cây đó khi ta áp dụng phép duyệt cây tổng quát Nh°ng danh sách duyệt trung tā thì khác nhau

Ví dụ:

Trang 35

35

quát

3.2 Đã thß

3.2.1 Định nghĩa

3.2.1.1 Đồ thị có hướng

Đá thá có h°ớng G = <V,E> bao gám: - V là mát tÁp hÿu h¿n các đßnh

- E là mát tÁp hÿu h¿n, có thứ tā các cặp đßnh của V, gọi là c¿nh Ví dụ, đá thá có h°ớng G1 = <V1, E1>, với V1, E1 đ°ợc xác đánh nh° sau: - V1 = {a, b, c, d}

- E1 = {(a,b); (a,c); (b,d); (c,b); (d,d)} Khi đó biểu diễn hình học của đá thá này nh° sau:

Chú ý r¿ng, trong đá thá có h°ớng, c¿nh là 1 cặp có thứ tā các đßnh, vì vÁy c¿nh (a, c) và (c, a) là khác nhau Ngoài ra, mát đßnh cũng có thể nßi tới chính nó để t¿o thành 1 c¿nh

Mßi thành phần thuác V đ°ợc gọi là 1 đßnh hoặc 1 nút của đá thá, vì vÁy V đ°ợc gọi là tÁp các đßnh của đá thá Mßi thành phần thuác E đ°ợc gọi là 1 c¿nh hoặc 1 cung, vì vÁy E đ°ợc gọi là tÁp các c¿nh của đá thá

Mát c¿nh (u,v) của đá thá có h°ớng có thể đ°ợc biểu thá d¿ng u ò v Đßnh u khi đó đ°ợc gọi là đßnh kề của v C¿nh (u,v) đ°ợc gọi là c¿nh xuất phát từ u Ta ký hiệu

Ngày đăng: 14/09/2024, 21:31

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

TÀI LIỆU LIÊN QUAN