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

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

144 83 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

Thông tin cơ bản

Định dạng
Số trang 144
Dung lượng 4,91 MB

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

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]

Trang 1

GV : Văn Thị Thiên TrangKhoa : Công Nghệ Thông Tin

CẤU TRÚC DỮ LIỆU

& GiẢI THUẬT

Trang 2

MÔ TẢ HỌC PHẦN

những thao tác cơ sở trên từng CTDL, kết hợp với việc phát triển tư duy giải thuật để hình thành nên chương trình máy tính.

Trang 3

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

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

- Bài 9 Cây nhị phân tìm kiếm cân bằng - cây AVL

Trang 4

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

Nội dung

1.1 Vai trò CTDL trong một đề án tin học

1.4 Kiểu dữ liệu cơ bản

1.5 Kiểu dữ liệu có cấu trúc

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

Trang 5

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

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

Xử lý trên đối tượng DL

Bài toán thực tế

Đối tượng

dữ liệu

Trang 6

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

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

– Muôn hình vạn trạng, đa dạng, phong phú

– Thường có chứa đựng quan hệ với nhau

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

– Phản ánh chính xác dữ liệu thực tế

– Dễ dàng xử lý trong máy tính

Xây dựng CTDL

Trang 7

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

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

Đối tượng DL

Thao tác xử lý Kết quả

mong muốn

Xây dựng giải thuật

Trang 8

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

Giải thuật

Chương trình

Cấu trúc dữ liệu

Quan hệ chặt chẽ

Trang 9

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

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

– Sử dụng tài nguyên vừa đủ để thực hiện chứcnăng & nhiệm vụ

Trang 10

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

• Trừu tượng hoá

– Làm đơn giản hóa, sáng sủa, dễ hiểu hơn

– Che đi phần chi tiết, làm nổi bật cái tổng thể

• Trừu tượng hoá dữ liệu: đưa ra các kiểu dữ liệutrừu tượng (Abstract Data Type)

Trang 11

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

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

– Mô tả dữ liệu

• Tử số

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

Trang 12

1.4 Kiểu dữ liệu cơ bản

• Thường đơn giản và không có cấu trúc, được NNLT xây dựng sẵn, nên còn gọi là kiểu dữ liệu dựng sẵn.

• Thường là các trị vô hướng:

– số nguyên

– số thực

– ký tự

– giá trị logic

Trang 13

1.4 Kiểu dữ liệu cơ bản (tt)

char 1 -128 đến 127 Có thể dùng như số nguyên 1

byte có dấu hay kiểu ký tự unsigned char 1 0 đến 255 Số nguyên 1 byte ko dấu

int 2 -32768 đến 32767

unsigned int 2 0 đến 65355 Gọi tắt là unsigned

long 4 -2 32 đến 2 31 -1

unsigned long 4 0 đến 2 32 -1

float 4 3.4E-38 … 3.4E38 Giới hạn chỉ trị tuyệt đối.Các

giá trị <3.4E-38 được coi = 0 Tuy nhiên kiểu float chỉ có 7 chữ số có nghĩa.

double 8 1.7E-308 … 1.7E308

Trang 14

1.5 Kiểu dữ liệu có cấu trúc

• Kết hợp nhiều kiểu dữ liệu cơ bản để phản ánhbản chất của đối tượng thực tế

• Đa số các ngôn ngữ đều cài đặt sẵn một số kiểu

có cấu trúc cơ bản: mảng, chuỗi, tập tin, bảnghi…

• Ngoài ra cung cấp cơ chế cho người lập trìnhcài đặt các dữ liệu cấu trúc khác

Trang 15

1.5 Kiểu dữ liệu có cấu trúc

• Cấu trúc dữ 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

Sinh Viên

Trang 16

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

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

Trang 17

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

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

– O(1) : Nếu T(n) là hằng 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( n 2 ), O(n 3 ),…,O(n ): Độ phức tạp đa thức

Trang 18

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

• Thường dựa vào số phép so sánh và số phép gán

2

) 1 (

n

) 1 (

) 1

n i

n

a i

2 1

n

) 1 2

)(

1 (

n i

n

i

) 1

2

3 = +

n n n

Trang 19

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

1 Viết chương trình C khai báo kiểu dữ liệu là mảng một chiều,

chương trình có các chức năng như sau:

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

– Xuất các phần tử trong mảng.

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

chương trình có các chức năng sau:

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

– Xuất các phần tử trong ma trận.

3 Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng cho thông tin

sinh viên với các thao tác nhập, xuất thông tin của sinh viên.

4 Hãy xây dựng và hiện thực kiểu dữ liệu trừu tượng của số hữu tỉ

a/b với các tác vụ cộng hai số hữu tỉ, nhân hai số hữu tỉ, chia hai

số hữu tỉ.

Trang 21

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

• Tìm kiếm là quá trình xác định một đối tượng nào đó trong một tập các đối tượng Kết quả trả về:

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

– Chỉ số (nếu có) xác định vị trí của đối tượng trong tập đó.

• Việc tìm kiếm dựa theo một trường nào đó của đối tượng, trường này là khóa (key) của việc tìm kiếm.

– VD: Tìm sinh viên có họ tên X trong DSSV.

• SV {MaSV, HoTen, DiaChi,…}

• Khoá?

• Kết quả trả về?

Trang 22

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

• Bài toán được mô tả như sau:

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

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

Tìm kiếm

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

Tập dữ liệu đã được sắp xếp Tập dữ liệu

bất kỳ

Trang 23

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

• Ý tưởng: duyệt tuần tự từ phần tử đầu tiên, lần lượt so

sánh khóa tìm kiếm với khoá tương ứng của các phần

tử trong danh sách Cho đến khi gặp phần tử cần tìm hoặc đến khi duyệt hết danh sách.

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

a[i] = x

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

Tìm thấy

Đ Đ

S

S

Trang 25

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

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

/* Trả về: vị trí xuất hiện đầu tiên của x trong mảng a Trả về: -1 nếu x không có trong mảng a */

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

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

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

}

Trang 26

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

• Thuật toá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 nhưng không có x

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

}

Trang 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ủa các phần tử trong mảng, do vậy đây là phương pháp tổng quát nhất để tìm kiếm trên một dãy bất kỳ

• Một thuật toán có thể được cài đặt theo nhiều cách khác nhau, kỹ thuật cài đặt ảnh hưởng nhiều đến tốc độ thực hiện

Ví dụ như thuật toán Search cải tiến sẽ chạy nhanh hơn thuật toán trước do vòng lặp while chỉ so sánh một điều kiện

Trang 28

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

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

 k[n].

Trang 29

• Đoạn a[left, ,mid] chứa các phần tử <X

• Tìm X trong đoạn a[mid+1, , right]

– Nếu a[mid]>X:

• Đoạn a[mid, ,right] chứa các phần tử >X

• Tìm X trong đoạn a[left, , right-1]

• Quá trình tìm kiếm thất bại nếu left>right

Trang 30

Left = 4

X = 8

Right = 7 Mid = 5

Đoạn tìm kiếm

=

<

Trang 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) // nếu tìm được

Trang 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 trong mảng bằng 2 phương pháp: Tìm tuần tự và 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 cuốn sách.

– Tìm cuốn sách có mã là X bằng phương pháp tìm kiếm tuần tự (X nhập từ bàn phím).

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

– Liệt kê thông tin các cuốn sách có giá > G (G nhập từ bàn phím) – Tìm cuốn sách có giá lớn nhất.

Trang 33

3.2.3 Selection Sort 3.2.4 Insertion Sort 3.2.5 Quick sort

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

Trang 34

3.1 Giới thiệu bài toán sắp xếp

• 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ượngtheo một thứ tự nhấtđịnh

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

• Việc sắp xếp sẽ được tiến hành dựa vào giá trị khoá này

Trang 35

3.1 Giới thiệu bài toán sắp xếp

• Mô tả bài toán:

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

– Dựa theo khóa sắp xếp định vị lại thứ tự bản ghi – Chuyển các bản ghi về vị trí mới

• Hai thao tác cơ bản:

– So sánh

– Gán

Trang 37

3.2.1 Interchange Sort

• Ý tưởng

– Xuất phát từ đầu dãy, lần lượt tìm nhữngphần tử còn lại không thoả thứ tự với phần tửđang xét Với mỗi phần tử tìm được màkhông thoả thứ tự Thực hiện hoán vị để thoảthứ tự

– Lặp lại tương tự với các phần tử tiếp theo

Trang 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 các phần tử sau

Trang 39

3.2.1 Interchange Sort

10 3 7 6 2 5 4 16

i

j

Trang 40

3.2 2 Bubble Sort

• Ý tưởng chính

– Xuất phát từ cuối dãy, đổi chỗ các cặp phần

tử kế cận để đưa phần tử nhỏ hơn về đầu

– Sau đó ở bước tiếp theo không xét phần tử

đó nữa Do vậy lần xử lý thứ i sẽ có vị trí đầudãy là i

– Lặp lại xử lý trên cho đến khi không còn cặpphần tử nào được xét

Trang 41

3.2 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ề vị trí i

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

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

j = j -1;

– B3: i = i+1; // lần xử lý kế tiếp

Nếu i > n-2: Hết dãy  Dừng Ngược lại: quay lại B2

Trang 46

3.2.3 Selection Sort

• Chọn phần tử có khóa nhỏ nhất trong 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 hiện hành chỉ còn N-1 phần tử

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

– Lặp quá trình trên cho dãy hiện hành… đếnkhi dãy hiện hành chỉ còn một phần tử

Trang 47

3.2.3 Selection Sort

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

–B1: i = 0

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

–B3: Hoán vị a[i] và a[min]

–B4: Nếu i < n -2 thì i = i+1  Lặp B2

Trang 50

3.2.4 Insertion Sort

• Ý tưởng chính

– Cho dãy ban đầu a[0], a[1], , a[n-1], ta có thể xem

dãy con gồm một phần tử a[0] đã được sắp.

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

được sắp.

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

sắp

– Cho đến khi 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]

được sắp.

Trang 51

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

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

– B4: a[pos] = x; // có đoạn a[0] a[i] được sắp

– B5: i = i +1;

Nếu i < n: Lặp lại B2 Ngược lại: Dừng  Dãy đã được sắp

Trang 53

3.2.5 Quick Sort

• Thuật toán do Hoare đề xuất

– Tốc độ trung bình nhanh hơn thuật toá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ầndựa vào một giá trị x

• Dãy 1: gồm các phần tử a[i] ko lớn hơn x (<=x)

• Dãy 2: gồm các phần tử a[i] ko nhỏ hơn x (>=x)

Trang 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 con 1: a[left] a[j] < x

– Dãy con 2: a[j+1] a[i-1] = x

– Dãy con 3: a[i] a[right] > x

• B2:

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

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

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

Phân hoạch dãy a[i] a[right]

Trang 55

3.2.5 Quick Sort

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

– a[k] < x, với k = 1 i

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

Trang 57

i<right => sắp xếp bằng cách phân hoạch tiếp

i<right => sắp xếp bằng

cách phân hoạch tiếp

Trang 59

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

1 Viết chương trình minh hoạ các phương pháp

sắp xếp, chương trình có các chức năng chínhnhư sau:

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

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

– Xem danh sách sau khi đã sắp xếp.

2 Viết chương trình nhập vào danh sách sinh viên,

thông tin của 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.

Trang 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

4.5.1 Danh sách liên kết vòng 4.5.2 Danh sách liên kết kép

Trang 61

4.1 Khái niệm danh sách

• Danh sách là một tập hợp các phần tử cùng kiểu dữ liệu, các phần tử trong danh sách có tính thứ tự.

Trang 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 trong bộ nhớ

– Kích thước danh sách chỉ bị giới hạn do RAM

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

Insert, Delete

Trang 65

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

• Cài đặt mảng 1 chiều (SV tự cài đặt)

Trang 66

4.4 Hiện thực DSLK đơn

• 4.4.1 Định nghĩa

• 4.4.2 Các thao tác cơ bản

Trang 67

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

• DSLK đơn là một danh sách các node, mỗi node gồm 2 thành phần:

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

– Phần chỉ vị trí (địa chỉ) của phần tử tiếp theotrong danh sách – Next

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

Info Next

Node

Trang 68

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

• Khai báo 1 node

typedef struct node {

struct node * next;

}Node;

Trang 69

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

(giữ địa chỉ của node đầu tiên)

pHead

pTail

Trang 71

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

typedef struct node {

int info;

struct node * next; }Node;

Node* pHead;

Trang 72

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

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

void Init(Node * & pHead)

{

pHead = NULL;

}

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

int IsEmpty(Node* pHead) {

return (pHead==NULL); }

Trang 73

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

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

Node* CreateNode(int X) {

Node* p=new Node;

Trang 74

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

Trang 75

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

Trang 76

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

Trang 77

4.4.2 DSLK đơn – Xóa sau

• Xoá phần tử sau node p trong danh sách

q p

p

Trang 78

4.4.2 DSLK đơn – Xóa toàn bộ

Trang 79

4.5 Các loại DSLK khác

4.5.1 DSLK vòng

4.5.2 DSLK kép

Trang 80

4.5.1 DSLK vòng

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

• Trường next của nút cuối chỉ đến đầu danh sách

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

Trang 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;

pList = NULL; pList trỏ nút cuối dsKhởi tạo dslk

Trang 83

4.5.1 DSLK kép

• Cho phép di chuyển 2 chiều đến nút trước và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 là NULL

• Nút cuối có next là NULL

Trang 84

struct node * prev;

struct node * next;

}Node;

Node* pHead;

pHead= NULL;

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

trỏ đến nút trước trỏ đến nút sau

Trang 85

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

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

– Tạo danh sách liên kết đơn, mỗi phần tử là một số nguyên.

– Xuất dãy số

– Cài đặt các thao tác thêm, xóa trên 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 mỗi sv gồm: mã sv, họ tên, điểm trung bình Chương trình có các chức năng sau:

– Tạo 1 danh sách gồm n SV (n nhập từ bàn phím, thông tin của mỗi sv nhập từ bàn phím)

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

– Xuất thông tin các sv có ĐTB>5

– Tìm sinh viên có tên là X

– Sắp xếp danh sách tăng theo ĐTB

Trang 86

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

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

liên kết đôi.

4 Viết chương trình hiện thực danh sách

liên kết vòng.

Trang 87

Bài 5 STACK

5.1 Giới thiệu về Stack

5.2 Cài đặt Stack

5.3 Ứng dụng

Trang 88

5.1 Giới thiệu Stack

• Stack là một danh sách đặc biệt mà việc thêm vào và loại bỏ được thực hiện tại một đầu (gọi là đỉnh –top của stack)

• Hoạt động theo cơ chế LIFO (Last In First Out)

Trang 89

5.1 Giới thiệu Stack

Cơ chế:

Last In First Out

LIFO

Stack

Trang 90

Push / Pop hơi

phức tạp

Push/Pop khá dễ dàng

Trang 91

5.2 Cài đặt Stack

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

typedef struct node

Trang 93

5.2 Cài đặt Stack - Push

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

– Tạo node mới có dữ liệu x

– Thêm vào đầu danh sách

3

s

p

Trang 94

5.2 Cài đặt Stack - Pop

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

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

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

1 2 3

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