1. Trang chủ
  2. » Nghệ sĩ và thiết kế

CẤU TRÚC DỮ LIỆU & GiẢI THUẬT

144 82 1

Đ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

Nội dung

• 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 theo một thứ tự nhất định. • Trường tham gia quá trình tìm kiếm gọi là khoá (key)[r]

(1)

GV : Văn Thị Thiên Trang Khoa : Cơng Nghệ Thơng Tin

(2)

MƠ TẢ HỌC PHẦN

-

Tìm

hiểu phương pháp tổ chức và

những thao tác sở CTDL,

kết hợp với việc phát triển tư giải

thuật để hình thành nên chương trình

máy tính.

-

Hiểu tầm quan trọng giải thuật

và cách

tổ chức liệu, hai thành tố

quan

trọng cho chương trình.

-

Củng cố phát triển kỹ lập trình

(3)

NỘI DUNG HỌC PHẦN

- Bài Tổng quan cấu trúc liệu giải thuật - Bài Tìm kiếm

- Bài Sắp xếp

- Bài Danh sách liên kết - Bài Stack

- Bài Queue

- Bài Cây nhị phân

- Bài Cây nhị phân tìm kiếm - BST

(4)

Bài TỔNG QUAN VỀ CTDL & GT

Nội dung

1.1 Vai trò CTDL trong

một đề án tin học

1.2 Các tiêu

chuẩn đánh giá CTDL

1.3.

Trừu tượng hóa liệu

1.4.

Kiểu liệu bản

1.5.

Kiểu liệu có cấu trúc

(5)

1.1 Vai trị CTDL đề án tin học

Bài toán giải trong máy tính

Xử lý đối tượng DL Bài toán thực tế

(6)

1.1 Vai trò CTDL đề án tin học

• Dữ liệu thực tế:

– Mn hình vạn trạng, đa dạng, phong phú – Thường có chứa đựng quan hệ với

• Cần phải tổ chức biểu diễn thành cấu trúc

thích

hợp nhất

– Phản ánh xác liệu thực tế – Dễ dàng xử lý máy tính

(7)

1.1 Vai trò CTDL đề án tin học

Xây

dựng thao tác xử lý

Dựa Y/C cụ thể, xác định trình tự giải vấn đề máy tính để đưa kết mong muốn

Đối tượng DL

Thao tác xử lý Kết quả mong muốn

(8)

1.1 Vai trò CTDL đề án tin học

Giải thuật

Chương trình

Cấu trúc liệu

(9)

1.2 Các tiêu chuẩn đánh giá CTDL

• Phản ánh thực tế:

– Thể đầy đủ thông tin nhập/xuất tốn

• Phù hợp với thao tác xử lý:

– Tăng tính hiệu chương trình → hiệu dự án tin học

• Tiết kiệm tài nguyên hệ thống:

(10)

1.3.

Trừu tượng hóa liệu

• Trừu tượng hố

– Làm đơn giản hóa, sáng sủa, dễ hiểu – Che phần chi tiết, làm bật tổng thể

• Trừu tượng hoá liệu: đưa kiểu liệu trừu tượng (Abstract Data Type)

• ADT: gồm

– Mô tả liệu

– Tác vụ liên quan

(11)

1.3.

Trừu tượng hóa liệu

• VD: mơ tả kiểu liệu trừu tượng số hữu tỉ a/b với tác vụ: +,*, /

– Mơ tả liệu • Tử số

• Mẫu số (≠0) – Mơ tả tác vụ

Cộng(Số_Hữu_Tỉ 1, Số_Hữu_Tỉ 2) • Nhập:

– a, b tử số mẫu số Số_Hữu_Tỉ – c, d tử số mẫu số Số_Hữu_Tỉ • Xuất:

(12)

1.4.

Kiểu liệu bản

• Thường đơn giản khơng có cấu trúc, NNLT

xây dựng sẵn, nên gọi kiểu liệu dựng sẵn

• Thường trị vơ hướng:

– số nguyên

– số thực

– ký tự

(13)

1.4.

Kiểu liệu (tt)

Tên kiểu KT Miền giá trị Ghi chú

char 1 -128 đến 127 Có thể dùng số nguyên byte có dấu hay kiểu ký tự unsigned char 1 đến 255 Số nguyên byte ko dấu

int 2 -32768 đến 32767

unsigned int 2 đến 65355 Gọi tắt unsigned long 4 -232 đến 231-1

unsigned long 4 đến 232-1

float 4 3.4E-38 … 3.4E38 Giới hạn trị tuyệt đối.Các giá trị <3.4E-38 coi = Tuy nhiên kiểu float có chữ số có nghĩa

(14)

1.5.

Kiểu liệu có cấu trúc

• Kết hợp nhiều kiểu liệu để phản ánh chất đối tượng thực tế

• Đa số ngơn ngữ cài đặt sẵn số kiểu có cấu trúc bản: mảng, chuỗi, tập tin, ghi…

(15)

1.5.

Kiểu liệu có cấu trúc

• Cấu trúc liệu Sinh viên

Mã SV: chuỗi kt

Tên SV: chuỗi kt

Ngày sinh: ngày tháng

Nơi sinh: chuỗi kt

(16)

1.6.

Độ phức tạp giải thuật

• Sự cần thiết phân tích giải thuật

GT A

GT B

GT C

Vấn đề cần giải

GT tốt

1 Giải thuật

2 Giải thuật đơn giản

(17)

1.6.

Độ phức tạp giải thuật

• Các độ phức tạp thường gặp:

– O(1) : Nếu T(n) số (T(n)=C) – O(log2n) : Độ phức tạp dạng logarit

– O( n) : Độ phức tạp tuyến tính

– O(nlog2n): Độ phức tạp tuyến tính logarit

– O( n2), O(n3),…,O(n ): Độ phức tạp đa thức – O(n!), O( nn)

• Thơng thường thuật giải có độ phức tạp đa

thức cài đặt

(18)

1.6.

Độ phức tạp giải thuật

• Thường dựa vào số phép so sánh số phép gán • Một số công thức thường dùng

n n i =

=1

1 1 1

1 + − = − =

= = = a b a i b i b a i ) ( + =

= n n i n i ) ( )

(n a a

n i n a i − − + =

= ) ( 2 + =

= n n i n i ) )( (

2 = + +

= n n n i n i ) ( 2

3 = +

n n

i

(19)

CÂU HỎI ÔN TẬP BÀI 1

1 Viết chương trình C khai báo kiểu liệu mảng chiều, chương trình có chức sau:

– Nhập giá trị vào mảng

– Xuất phần tử mảng

2 Viết chương trình C có khai báo kiểu liệu mảng hai chiều, chương trình có chức sau:

– Nhập giá trị vào ma trận

– Xuất phần tử ma trận

3 Hãy xây dựng thực kiểu liệu trừu tượng cho thông tin sinh viên với thao tác nhập, xuất thông tin sinh viên

(20)

Bài TÌM KIẾM

• Nội dung

2.1 Giới thiệu tốn tìm kiếm 2.2 Tìm kiếm tuyến tính

(21)

2.1 Giới thiệu tốn tìm kiếm

• Tìm kiếm q trình xác định đối tượng tập đối tượng Kết trả về:

– Đối tượng tìm (nếu có)

– Chỉ số (nếu có) xác định vị trí đối tượng tập • Việc tìm kiếm dựa theo trường đối

tượng, trường khóa (key) việc tìm kiếm – VD: Tìm sinh viên có họ tên X DSSV

• SV {MaSV, HoTen, DiaChi,…} • Khố?

(22)

2.1 Giới thiệu tốn tìm kiếm

• Bài tốn mơ tả sau:

– Tập liệu lưu trữ dãy a1, a2, ,an Giả sử chọn cấu trúc liệu mảng để lưu trữ dãy số nhớ chính, có khai báo: int a[n];

– Khóa cần tìm x: int x;

Tìm kiếm

Tìm kiếm tuyến tính Tìm kiếm nhị phân

Tập liệu xếp Tập liệu

(23)

2.1 Giới thiệu toán tìm kiếm

• Ý tưởng: duyệt từ phần tử đầu tiên, so sánh khóa tìm kiếm với khoá tương ứng phần tử danh sách Cho đến gặp phần tử cần tìm đến duyệt hết danh sách

• Các bước tiến hành sau: i =

a[i] = x

i<n Khơng tìm thấy

Tìm thấy

Đ Đ

S

(24)

1.1 Tìm kiếm tuyến tính

• Ví dụ: Cho dãy số a, giá trị tìm X = 8:

12

12 2 5 8 1 6 4

X = 8

Tìm thấy

12 2 5 8 1 6 4

X = 7

Khơng tìm thấy

(25)

1.1 Tìm kiếm tuyến tính

• Thuật tốn tìm kiếm tuyến tính

/* Trả về: vị trí xuất x mảng a Trả về: -1 x khơng có mảng a */

int Search(int a[], int n, int key) {

int i =0;

while (i<n && key != a[i]) i++;

if (i < n)

return i; // tìm thấy vị trí i

return -1; // tìm khơng thấy

(26)

1.1 Tìm kiếm tuyến tính

• Thuật tốn tìm kiếm tuyến tính cải tiến

int Search(int a[], int n, int key) {

int i =0;

a[n] =key; // thêm phần tử thứ n+1

while (key != a[i]) i++;

if (i == n)

return -1; // tìm hết mảng khơng có x

return i; // tìm thấy x vị trí i

(27)

Nhận xét

• Giải thuật tìm kiếm tuyến tính khơng phụ thuộc vào thứ tự

các phần tử mảng, phương pháp tổng

quát để tìm kiếm dãy

(28)

1.2 Tìm kiếm nhị phân

• Phép tìm kiếm nhị phân áp dụng

trên

dãy khóa

đã có thứ tự

: k[1]

 k[2] 

(29)

1.2 Tìm kiếm nhị phân

• Giả sử ta cần tìm đoạn a[left, ,right] với khóa tìm kiếm X

• Chia đơi phạm vi tìm kiếm mid=(left+right)/2

• Xét phần tử a[mid]:

– Nếu a[mid]=X: Tìm thấy vị trí mid – Nếu a[mid]<X:

• Đoạn a[left, ,mid] chứa phần tử <X • Tìm X đoạn a[mid+1, , right]

– Nếu a[mid]>X:

• Đoạn a[mid, ,right] chứa phần tử >X • Tìm X đoạn a[left, , right-1]

(30)

1.2 Tìm kiếm nhị phân

• Cho dãy số gồm phần tử bên X

= 8:

1 12 15

1 2 4 5 6 8 12 15

Left = 0

X = 8

Right = 7 Mid = 3

1 2 4 5 6 8 12 15

Left = 4

X = 8

Right = 7 Mid = 5

Đoạn tìm kiếm

(31)

1.2 Tìm kiếm nhị phân

int BinarySearch(int a[], int n, int key){ int left = 0, right = n-1, mid;

while (left <= right){

mid = (left + right)/ 2; // lấy điểm giữa

if (a[mid] == key) // tìm được

return mid;

if (a[mid] < key) // tìm đoạn bên phải mid

left = mid+1; else

right = mid-1; // tìm đoạn bên trái mid

}

return -1; // khơng tìm được

(32)

CÂU HỎI ÔN TẬP BÀI 2

1 Sinh mảng ngẫu nhiên gồm N số nguyên có giá trị  (-100, 100)

– Tìm phần tử có giá trị X mảng phương pháp: Tìm tìm nhị phân

2 Cho cấu trúc Sách (Mã sách: char[10], Tên sách: char[40], Giá: long) Viết chương trình thực hiện:

– Nhập, xuất danh sách gồm N sách

– Tìm sách có mã X phương pháp tìm kiếm (X nhập từ bàn phím)

– Tìm sách có mã X phương pháp tìm kiếm nhị phân (X nhập từ bàn phím)

(33)

Bài SẮP XẾP

• Nội dung

3.1 Giới thiệu toán xếp 3.2 Các giải thuật xếp

3.2.1 Interchange Sort 3.2.2 Bubble Sort

3.2.3 Selection Sort 3.2.4 Insertion Sort 3.2.5 Quick sort

(34)

3.1 Giới thiệu tốn xếp

• Sắp xếp q trình bố trí lại phần tử tập đối tượng theo thứ tự định

• Trường tham gia q trình tìm kiếm gọi khoá (key)

(35)

3.1 Giới thiệu tốn xếp

• Mơ tả tốn:

– Cho tập N phần tử có m thuộc tính, biểu diễn dạng ghi Dựa vào (hoặc vài) thuộc tính để xếp phần tử theo trật tự

– Dựa theo khóa xếp định vị lại thứ tự ghi – Chuyển ghi vị trí

• Hai thao tác bản:

(36)

3.2 Các giải thuật xếp

3.2.1 Interchange Sort

3.2.2 Bubble Sort

(37)

3.2.1 Interchange Sort

• Ý tưởng

– Xuất phát từ đầu dãy, tìm phần tử cịn lại khơng thoả thứ tự với phần tử xét Với phần tử tìm mà khơng thoả thứ tự Thực hoán vị để thoả thứ tự

(38)

3.2.1 Interchange Sort

• Các bước tiến hành

✓B1: i = 0; // bắt đầu từ đầu dãy ✓B2: j = i +1; // duyệt qua phần tử sau ✓B3: Chừng j < n thực hiện:

Nếu a[j] < a[i] Đổi chỗ a[i] a[j]; j = j +1;

✓B4: i = i +1;

(39)

3.2.1 Interchange Sort

10

3

7

6

2

5

4

16

i

(40)

3.2 Bubble Sort

• Ý tưởng chính

– Xuất phát từ cuối dãy, đổi chỗ cặp phần tử kế cận để đưa phần tử nhỏ đầu

– Sau bước khơng xét phần tử Do lần xử lý thứ i có vị trí đầu dãy i

(41)

3.2 Bubble Sort

• Các bước tiến hành

– B1: i=0; // lần xử lý đầu tiên

– B2: j=n-1; // duyệt từ cuối dãy ngược vị trí i

Trong (j>i) thực hiện:

Nếu a[j] < a[j-1]: Hoán đổi a[j] a[j-1] j = j -1;

– B3: i = i+1; // lần xử lý

(42)

3.2 Bubble Sort

12

i=0

2 8 5 1 6 4 15

j=6

12

i=0

2 8 5 1 4 6 15

j=4

12

i=0

2 8 1 5 4 6 15

j=3

j=7

(43)

3.2 Bubble Sort

12

i=0

2 1 8 5 4 6 15

j=2

12

i=0

1 2 8 5 4 6 15

j=1

1

i=1

12 2 8 5 4 6 15

(44)

3.2 Bubble Sort

1

i=2

2

12 4 5 8 6 15

j=3

1

i=3

2

4

12 5 8 6 15

j=6

1

i=3

2

4

12 5 6 8 15

(45)

3.2 Bubble Sort

1

i=4

2

4

5

12 6 8 15

j=5

1

i=5

2

4

5

6

12 8 15

j=6

1

i=6

2

4

5

6

8

12

15

(46)

3.2.3 Selection Sort

Ý

tưởng chính

• Chọn phần tử có khóa nhỏ N

phần tử ban đầu.

• Đổi chỗ phần tử vừa chọn với phần tử đầu

dãy

• Xem dãy hành cịn N-1 phần tử

(không xét

phần tử đầu)

– Bắt đầu từ vị trí thứ hai

(47)

3.2.3 Selection Sort

• Các bước thực hiện:

–B1:

i = 0

–B2:

Tìm

phần tử a[min] nhỏ trong

dãy

hiện hành từ a[i] đến a[n-1]

–B3:

Hoán

vị a[i] a[min]

–B4:

Nếu i < n -2 i = i+1

 Lặp B2

(48)

3.2.3 Selection Sort

12

2

8

5

1

6

4

15

i=0 Vt_min=4

1

2

8

5

12

6

4

15

i=1

1

8

5

12

6

4

15

(49)

3.2.3 Selection Sort

1 2 4

5

12

6

8

15

i=3

1 2 4 5

12

6

8

15

i=4 Vt_min=5

1 2 4 5 6 8

12

15

i=6

(50)

3.2.4 Insertion Sort

• Ý tưởng chính

– Cho dãy ban đầu a[0], a[1], , a[n-1], ta xem dãy gồm phần tử a[0]

– Sau thêm a[1] vào đoạn a[0] cho a[0] a[1]

được

– Tiếp tục thêm a[2] vào để có a[0] a[1] a[2]

– Cho đến thêm xong a[n-1] vào đoạn a[0] a[1] a[n-2]

 đoạn a[0] a[1] a[n-2] a[n-1]

(51)

3.2.4 Insertion Sort

• Các bước tiến hành

– B1: i = 1; //giả sử có đoạn a[0]

sắp

– B2: x= a[i];

Tìm được vị trí cần chèn x vào pos

– B3: Dời chỗ phần tử từ a[pos]  a[i-1] sang phải vị trí để dành chỗ cho a[i]

– B4: a[pos] = x; // có đoạn a[0] a[i]

– B5: i = i +1;

Nếu i < n: Lặp lại B2

(52)

3.2.4 Insertion Sort

2

5

8

12

1 6 4 15

i=4

1

2

4

5

6

8

12

15

(53)

3.2.5 Quick Sort

• Thuật tốn Hoare đề xuất

– Tốc độ trung bình nhanh thuật tốn khác – Do Hoare dùng “quick” để đặt tên

• Ý tưởng chính

– QS phân hoạch dãy ban đầu thành hai phần dựa vào giá trị x

(54)

3.2.5 Quick Sort

• Giải

thuật

sắp

xếp

dãy

a[left],

a[left+1], ,a[right]

được phát biểu đệ quy

như sau:

• B1:

Phân

hoạch dãy a[left] a[right] thành các

dãy con:

– Dãy 1: a[left] a[j] < x – Dãy 2: a[j+1] a[i-1] = x – Dãy 3: a[i] a[right] > x

• B2:

– Nếu (left < j) // dãy có nhiều phần tử

Phân hoạch dãy a[left] a[j]

– Nếu (i < right) // dãy có nhiều phần tử

(55)

3.2.5 Quick Sort

• Sau phân hoạch dãy ban đầu phân thành ba phần:

– a[k] < x, với k = i – a[k] = x, với k = i j – a[k] > x, với k = j n

• Nếu đoạn 1, đoạn có phần tử dãy ban đầu

• Nếu đoạn đoạn có nhiều phần tử ta cần lại đoạn (áp dụng phân hoạch trên)

(56)

3.2.5 Quick Sort

12 2 8 5 1 4 6 15

Left Right

0 1 2 3 4 5 6 7

i j

5

X

Stop

Not < X

Stop

(57)

3.2.5 Quick Sort

4 2 1 5 8 12 6 15

Left Right

0 1 2 3 4 5 6 7

i j

i<right => xếp cách phân hoạch tiếp

(58)

3.3 Một số giải thuật xếp khác

(59)

CÂU HỎI ÔN TẬP BÀI 3

1 Viết chương trình minh hoạ phương pháp xếp, chương trình có chức sau:

– Sinh danh sách ngẫu nhiên gồm n số

– Chọn phương pháp xếp, sau chạy xong, chương trình có báo thời gian chạy

– Xem danh sách sau xếp

2 Viết chương trình nhập vào danh sách sinh viên, thông tin sinh viên bao gồm: mã số sinh viên, họ tên, điểm trung bình

– Sắp xếp danh sách sinh viên tăng dần theo họ tên – Sắp xếp danh sách sinh viên giảm dần theo điểm

(60)

Bài

4 DANH SÁCH LIÊN KẾT

• Nội dung

4.1 Khái niệm

4.2 Phương pháp cài đặt danh sách 4.3 Hiện thực danh sách kề

4.4 Hiện thực danh sách liên kết đơn 4.5 Các loại danh sách liên kết khác

(61)

4.1 Khái niệm danh sách

• Danh sách tập hợp phần tử cùng

kiểu liệu, phần tử danh sách có

tính

thứ tự.

• Các thao tác bản

– Khởi tạo

– Nhập/xuất danh sách – Thêm

– Xóa

(62)

4.2 Phương pháp cài đặt

2 cách cài đặt

Kiểu kế tiếp Kiểu liên kết

Danh sách liên kết -DSLK đơn

(63)

4.2 Phương pháp cài đặt

• Mảng chiều

– Kích thước cố định (fixed size)

– Các phần tử theo số  n-1 – Truy cập ngẫu nhiên (random access) – Chèn phần tử vào mảng khó

chèn

(64)

4.2 Phương pháp cài đặt

• Danh sách liên kết

– Cấp phát động lúc chạy chương trình

– Các phần tử nằm rải rác nhiều nơi nhớ – Kích thước danh sách bị giới hạn RAM

– Thao tác thêm xoá đơn giản

(65)

4.3 Hiện thực danh sách kề

(66)

4.4 Hiện thực DSLK đơn

• 4.4.1 Định nghĩa

(67)

4.4.1 DSLK Đơn - định nghĩa

• DSLK đơn danh sách node,

mỗi node gồm thành phần:

– Phần chứa liệu - Info

– Phần vị trí (địa chỉ) phần tử danh sách – Next

• Phần next trỏ, trỏ đến node kế tiếp

Info Next

(68)

4.4.1 DSLK Đơn - định nghĩa

• Khai báo node

typedef struct node {

DataType info;

struct node * next; }Node;

(69)

4.4.1 DSLK Đơn - định nghĩa

• Mơ tả DSLK

A1

Header Node Node

Tail Node

NUL L

Data Next

A2 A3 An

Con trỏ đến node đầu tiên

(giữ địa node đầu tiên)

pHead

(70)

4.4.1 DSLK Đơn - định nghĩa

• Ví dụ

‘A’ 500 ‘B’ 600

‘C’ 300 ‘D’ NULL 700

700 500

600 300

Địa chỉ

pHead

(71)

4.4.2 DSLK đơn – Thao tác bản

• Các thao tác bản

1 Init IsEmpty InsertFirst InsertAfter DeleteFirst DeleteAfter DeleteAll ShowList Search 10.Sort Phần minh hoạ dùng DataType int

typedef struct node {

int info;

struct node * next; }Node;

(72)

4.4.2 DSLK đơn – Thao tác bản

Khởi tạo Kiểm tra rỗng

void Init(Node * &pHead) {

pHead = NULL; }

//trả 1: danh sách rỗng //trả 0: danh sách không rỗng

int IsEmpty(Node* pHead) {

(73)

4.4.2 DSLK đơn – Thao tác tạo nút

•Tạo nút chứa liệu X

Node* CreateNode(int X) {

Node* p=new Node; p->info=X;

p->next=NULL; return p;

}

p=new Node;

new

p->info=X;

p->next=NULL;

(74)

4.4.2 DSLK đơn – Thêm đầu

pHead

pHead X

p=CreateNode(x);

new

pHead

1

2 3

pHead

p

p

p

(75)

4.4.2 DSLK đơn – Thêm sau nút

p p

tam

new

p

tam tam

(76)

4.4.2 DSLK đơn – Xóa đầu

pHead pHead

pHead

p = pHead

pHead

p

p p

(77)

4.4.2 DSLK đơn – Xóa sau

• Xố phần tử sau node p danh sách

q p

(78)

4.4.2 DSLK đơn – Xóa tồn bộ

pHead

p

pHead

p

pHead

p

pHead

(79)

4.5 Các loại DSLK khác

(80)

4.5.1 DSLK vịng

• Tương tự danh sách liên kết đơn.

• Trường next nút cuối đến đầu

danh sách

Trường Next nút cuối ko trỏ đến

(81)

4.5.1 DSLK vịng

• Mơ tả

– Sử dụng pList trỏ đến phần tử cuối danh sách

A1 A2 A3 An

pList

(82)

4.5.1 DSLK vịng

• Khai báo & khởi tạo

typedef struct node {

DataType info; struct node * next;

}Node;

Node* pList;

(83)

4.5.1 DSLK kép

• Cho phép di chuyển chiều đến nút trước sau

– Liên kết nút trước là: prev – Liên kết nút sau là: next

• Nút đầu có prev NULL • Nút cuối có next NULL

(84)

4.5.1 DSLK kép

• Khai báo

typedef struct node {

DataType info; struct node * prev; struct node * next; }Node;

Node* pHead; pHead= NULL;

pHead quản lý ds kép Khởi tạo dslk

(85)

CÂU HỎI ÔN TẬP BÀI 4

1 Nhập dãy số nguyên

– Tạo danh sách liên kết đơn, phần tử là số nguyên – Xuất dãy số

– Cài đặt thao tác thêm, xóa dãy số

2 Viết chương trình quản lý danh sách sinh viên (sử dụng DSLKĐ), thông tin sv gồm: mã sv, họ tên, điểm trung bình Chương trình có chức sau:

– Tạo danh sách gồm n SV (n nhập từ bàn phím, thơng tin sv nhập từ bàn phím)

– Xuất danh sách sinh viên

– Xuất thông tin sv có ĐTB>5 – Tìm sinh viên có tên là X

(86)

CÂU HỎI ÔN TẬP BÀI (tt)

3 Viết chương trình thực danh sách

liên kết đôi.

(87)

Bài STACK

5.1 Giới thiệu Stack

5.2 Cài đặt Stack

(88)

5.1 Giới thiệu Stack

• Stack là danh

sách đặc biệt mà việc thêm vào và loại bỏ thực đầu (gọi là đỉnh – top stack)

(89)

5.1 Giới thiệu Stack

Cơ chế:

Last In First Out LIFO

(90)

5.2 Cài đặt Stack

Mảng chiều Danh sách liên kết đơn

Kích thước stack thiếu, lúc thừa

Cấp phát động!

Push / Pop phức tạp

(91)

5.2 Cài đặt Stack

• Dùng danh sách liên kết đơn

typedef struct node {

DataType info; struct node * next; }Node;

typedef Node * STACK;

//sử dụng

STACK s; s quản lý Stack

Đầu ds

(92)

5.2 Cài đặt Stack

❖ InitStack

❖ IsEmpty

❖ Push

❖ Pop

Đầu ds

Các thao tác

(93)

5.2 Cài đặt Stack - Push

• Push: Thêm phần tử x vào Stack

– Tạo node có liệu x – Thêm vào đầu danh sách

2 1

3

s

New

1 2 3

s

(94)

3

5.2 Cài đặt Stack - Pop

• Pop: Lấy phần tử khỏi ngăn xếp

– Lấy phần tử đầu danh sách

– Trả nội dung và giải phóng nút

1 2 3 s

s

X=

3 2 1

p

(95)

5.3 Ứng dụng Stack

• Khử đệ quy

– Bài tốn đổi số, tháp Hà Nội

• Áp dụng cho toán dùng chế LIFO

– Chuyển biểu thức trung tố (Infix) sang biểu thức hậu tố (Postfix)

(96)

5.3 Ứng dụng - Bài tốn đổi số

• Nhập số nguyên (VD: nhập n=13) số (VD: CoSo=2) , xuất biểu diễn số theo số 13 2

0 1 0 1 0 1 1 Ngưng chia 2 6 1 1 0

0 3 2

1 11

0

(97)

CÂU HỎI ÔN TẬP BÀI 5

1.

Hiện thực Stack tác vụ Stack

bằng danh sách liên kết.

2.

Viết chương trình đổi số thập phân

sang

cơ số vận dụng Stack.

(98)

Bài QUEUE

6.1.

Giới thiệu Queue

6.2 Cài

đặt Queue

(99)

6.1 Giới thiệu Queue

(100)

6.2 Cài đặt Queue

• Dùng DSLK đơn

A1 A NULL

2 An

(101)

6.2 Cài đặt Queue

typedef struct node {

DataType info;

struct node * next;

}Node;

typedef struct QUEUE {

Node* pHead; Node* pTail;

}Queue;

• Queue dùng DSLK

– Con trỏ pHead trỏ đầu danh sách

– Con trỏ pTail trỏ đến cuối danh sách

– Thao tác Remove diễn pHead

– Tháo tác Insert diễn pTail

(102)

6.2 Cài đặt Queue

• Các thao tác bản

1 Init

2 IsEmpty Insert Remove

• Các thao tác bổ sung

QueueFirst

(103)

6.2 Cài đặt Queue - Insert

pHead pTail

5

pHead

5

pTail

new

X

p

(104)

6.2 Cài đặt Queue - Remove

• TH: Hàng đợi có phần tử

pHead

5

pTail

p

(105)

6.2 Cài đặt Queue - Remove

• TH: Hàng đợi có nhiều phần tử

pHead pTail

5

pHead

5

(106)

6.3 Ứng dụng

• Ứng dụng Queue

– Trong toán hàng đợi “Vào trước trước” FIFO:

• Hệ thống print server

• Cơ chế thơng điệp, đệm, hàng đợi xử lý kiện…

(107)

CÂU HỎI ÔN TẬP BÀI 6

1.

Hiện thực hàng đợi tác vụ của

hàng

đợi danh sách liên kết.

2.

Viết chương trình quản lý kho hàng dùng

hàng

đợi thực danh sách

(108)

Bài CÂY NHỊ PHÂN

• Nội dung

7.1 Cấu trúc tổng quát 7.2 Cây nhị phân

7.3 Mô tả nhị phân 7.3.1 Mô tả liệu 7.3.2 Mô tả tác vụ

(109)(110)

7.1 Cấu trúc tổng quát

• Tập hợp nút và cạnh nối nút đó

• Có nút gọi là gốc

• Quan hệ one-to-many nút

• Có đường từ gốc đến một

nút

• Các loại cây:

(111)

7.1 Cấu trúc tổng qt

• Nút gốc : khơng có nút cha

• Nút lá : khơng có nút con

• Nút trong : khơng phải nút và nút gốc

• Bậc nút: số nút nút đó

• Bậc cây : là bậc lớn nút trong

cây

• Mức nút:

– Nút gốc có mức = 0

– Các nút khác nút gốc có mức = mức nút cha + 1;

(112)

7.1 Cấu trúc tổng quát

J Z A D R B L F A K Q Lá Nút Gốc Cạnh Mức Mức Mức Mức

(113)

7.1 Cấu trúc tổng quát

Root

A

H

B

G F

E D

C

K J

L I

(114)(115)

7.3 Mô tả nhị phân

7.3.1 Mô

tả liệu

7.3.2 Mô

tả tác vụ

(116)

7.3.1 BT – Mơ tả liệu

• Cấu trúc đơn giản nhất, nút có tối đa nút

• Tại nút gồm thành phần

– Phần data: chứa giá trị, thông tin… – Liên kết đến nút trái (nếu có) – Liên kết đến nút phải (nếu có)

• Cây nhị phân rỗng (khơng có nút nào) • Cây NP khác rỗng có nút gốc

– Có đường từ gốc đến nút

(117)

7.3.1 BT – Mô tả liệu

A

B C

D E F

I H

G

Độ sâu/chiều cao =

Kích thước = (số nút)

Cây trái Cây phải

Mức

Mức

(118)

7.3.2 BT – Mô tả tác vụ

1 Khởi tạo Kiểm tra rỗng Tạo nút

4 Thêm trái Thêm phải

(119)

7.3.3 BT-

Duyệt cây

• Duyệt cây:

– Do cấu trúc khơng tuyến tính – cách duyệt NP

(120)

7.3.3 BT-

Duyệt cây

• Ví dụ:

A

B C

D E G H

K

I L

(121)

7.4 Hiện thực nhị phân

• Cài đặt NP dùng liên kết

typedef struct node {

DataType info; struct node * left; struct node * right;

} Node;

Node* pTree; Trỏ nút gốc NP

Chứa thông tin nút

(122)

7.4 Hiện thực nhị phân

8

5 10

1

7

20

pTree

(123)

7.4 Hiện thực nhị phân

• Các thao tác:

– CreateNode, FreeNode, Init, IsEmpty – InsertLeft, InsertRight

– DeleteLeft, DeleteRight

– PreOrder, InOrder, PostOrder – Search

– ClearTree

Phần minh hoạ dùng DataType

(124)

7.4 Hiện thực nhị phân

• Các thao tác mở rộng khác:

– Đếm số nút lá: CountLeaf

– Đếm số nút cây: CountNode – Xác định độ sâu/chiều cao – Tìm giá trị nhỏ nhất/lớn – Tính tổng giá trị

(125)

CÂU HỎI ÔN TẬP BÀI 7

Cho

trước mảng a có n phần tử (mảng số

nguyên/

hoặc mảng cấu trúc có trường

là khóa), hãy

tạo nhị phân có n

node,

mỗi nút lưu phần tử mảng.

1 Cài đặt hàm duyệt theo thứ tự: LNR, NLR, LRN, mức

2 Tìm node có giá trị X

3 Xác định chiều cao Đếm số node

(126)

Bài CÂY NHỊ PHÂN TÌM KIẾM

• Binary Search Tree (BST)

• Nội dung

8.1 Khái niệm

(127)

8.1 BST – Khái niệm

• BST nhị phân mà

mỗi nút thoả

– Giá trị tất nút trái < giá trị nút – Giá trị tất nút phải > giá trị nút

đó

5

3

1 4

10

8 20

(128)

8.2 BST – Cài đặt

• Thao tác tìm kiếm

5

10

30

2 8 25 45

3 6 9 14 33 66

x = 9

9<10, left 9>5, right 9>8, right

9=9, Tìm thấy

5<9

8<9

(129)

8.2 BST – Cài đặt

• Search

– Xuất phát từ gốc

• Nếu nút = NULL => ko tìm thấy

• Nếu khố x = khóa nút gốc => tìm thấy

• Ngược lại khố x < khố nút gốc => Tìm trên

cây bên trái

• Ngược lại => Tìm bên phải

(130)

8.2 BST – Cài đặt

• Xây dựng BST

– Chèn – Xóa

• Ln trì tính chất

(131)

8.2 BST – Cài đặt

• Thêm nút có liệu x vào • Nếu rỗng → thêm trực tiếp

• Ngoài ra:

– Thực tìm kiếm giá trị x

– Tìm đến cuối nút Y (nếu x ko tồn cây)

– Nếu x < y, thêm nút x bên trái Y – Nếu x > y, thêm nút x bên phải

Y

5

10

30

2 25 45

20

Y

X

(132)

8.2 BST – Cài đặt

• Delete: xóa phải đảm bảo cây

BST

– Thực tìm nút có giá trị x – Nếu nút nút lá, delete nút – Ngược lại

• Thay nút hai nút sau

– Y nút lớn bên trái – Z nút nhỏ bên phải

(133)

8.2 BST – Cài đặt - Delete

• TH 1

: nút p nút lá, xố bình

thường

5

10

30

2 25 45

5

10

30

2 45

(134)

8.2 BST – Cài đặt – Delete

• TH2

: p

chỉ có con

– Cho nút cha p trỏ tới nút nhất

của p

– Hủy p

5

10

30

2 25 45

Xóa X=5

10

30

(135)

8.2 BST – Cài đặt – Delete

• TH3: nút p có con, chọn nút thay để

xóa theo cách sau

– Nút lớn bên trái (lp->right==NULL) – Nút nhỏ bên phải (rp->left==NULL)

lp - Nút lớn

bên trái

Rp - Nút nhỏ

(136)

CÂU HỎI ÔN TẬP BÀI 8

1 Cài

đặt cấu trúc liệu liên kết cho cây

nhị phân tìm kiếm

2 Cài

đặt thao tác xây dựng cây: Init,

IsEmpty, CreateNode

3 Cài

đặt thao tác cập nhật: Insert,

Remove, ClearTree

(137)

Bài

9 CÂY NHỊ PHÂN TÌM KIẾM

CÂN BẰNG

• Do hai nhà tốn học người Nga là

Adelson Velski Landis xây

dựng vào

năm 1962 nên cịn gọi AVL.

• Nội dung

– 9.1 Định nghĩa

– 9.2 Các tác vụ xoay

(138)

9.1 Định nghĩa

• Cây NPTK cân bằng

– Là nhị phân tìm kiếm

– Tại nút: số nút nhánh trái nhánh phải chênh lệch ko nút!

P

Cây bên trái

Cây bên phải

(139)

9.2 Các tác vụ xoay

• Q trình cập nhật nhị phân tìm kiếm

thường làm cân bằng

• Thao tác:

(140)

9.2 Các tác vụ xoay

• RotateLeft

r

a

p

b

c

Xoay trái nút r

Cây a

Cây b

Cây c

(141)

9.2 Các tác vụ xoay

• RotateLeft

r

a

p

b

c

p

c

r

a

b

(142)

9.2 Các tác vụ xoay

• RotateRight

r

c

p

a

b

p

a

r

b

c

(143)

9.3 Cài đặt AVL

• Cài đặt dùng liên kết

typedef struct node{ int info;

int bf; //balance factor

struct node *left, *right; } Node;

(144)

CÂU HỎI ÔN TẬP BÀI 9

1 Xét tác vụ insert và remove để thêm nút và

xoá nút AVL.

– Vẽ lại hình ảnh BST thêm nút vào theo thứ tự sau: 8, 3, 5, 2, 20, 11, 30, 9, 18,

– Vẽ lại hình ảnh ta lần lược xoá nút và 20

2 Cài đặt cấu trúc liệu liên kết cho cây

AVL, với thao tác:

– Cài đặt thao tác xây dựng cây: Init, IsEmpty, CreateNode

Ngày đăng: 16/12/2020, 13:15

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

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

TÀI LIỆU LIÊN QUAN

w