Tải bản đầy đủ (.pptx) (87 trang)

Bài Giảng Cấu Trúc Dữ Liệu Và Giải Thuật ( combo full slides 5 chương )

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (631.43 KB, 87 trang )

BÀI GIẢNG
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT


NỘI DUNG
CHƯƠNG I: MỞ ĐẦU
CHƯƠNG II: NGĂN XẾP VÀ HÀNG ĐỢI
CHƯƠNG III GIẢI THUẬT SẮP XẾP
CHƯƠNG IV: CÂY
CHƯƠNG V: GIẢI THUẬT ĐỆ QUI


CHƯƠNG I: MỞ ĐẦU
1.1.Giải thuật và cấu trúc dữ liệu
- Thơng thường khi nói đến việc giải quyết bài tốn người ta
chỉ chú ý tới giải thuật (algorithms)
- Vì vậy: giải thuật là một dãy các câu lệnh (statements) chặt
chẽ và rõ ràng xác định một tuần tự các thao tác trên một đối
tượng nào đó sao cho sau một số hữu hạn bước thực hiện ta
đạt được kết quả mong muốn.
- Xét cho cùng giải thuật chỉ phản ánh các phép xử lý trên máy
tính điện tử, cịn chính dữ liệu với biểu diễn các thông tin cần
thiết cho bài toán
- Như vậy giữa cấu trúc dữ liệu và giải thuật có mối quan hệ
mật thiết với nhau. Khơng thể nói tới cấu trúc dữ liệu mà
khơng nói tới giải thuật và ngược lại


1.2.Cấu trúc dữ liệu và các vấn đề liên qua
1.2.1.Trong một bài toán dữ liệu bao gồm một tập các
phần tử cơ sở mà ta gọi là dữ liệu nguyên tử. Chúng có


thể là một chữ số, một kí tự..nhưng cũng có thể là một
con số hay một từ..
1.2.2.Cách biểu diễn một cấu trúc dữ liệu trong bộ nhớ
được gọi là cấu trúc lưu trữ
1.2.3.Trong ngơn ngữ lập trình bao giờ cũng có cấu trúc
dữ liệu tiền định, chẳng hạn như cấu trúc mảng.
1.3.Ngôn ngữ diễn đạt giải thuật
Bao gồm Pascal, C, C++…nhưng chúng ta sẽ gặp một số
hạn chế
- Phải luôn tuân thủ các quy tắc chặt chẽ về cú pháp của
ngơn ngữ đó dẫn đến việc trình bày về giải thuật và cấu
trúc dữ liệu có phần gị bó và nặng nề.


- Phải phụ thuộc vào cấu trúc dữ liệu tiền định của
ngôn ngữ nên đôi khi ta không thể hiện được đầy
đủ các ý về cấu trúc mà ta muốn biểu đạt
- Ngôn ngữ nào được chọn cũng chưa chắc khiến
mọi người u thích và muốn sử dụng
Vì vậy ta sẽ dùng một ngơn ngữ “thơ hơn” có đủ
khả năng biểu đạt được giải thuật trên các cấu trúc
đề cập đến đó là “giả ngơn ngữ” hay là ngơn ngữ
“tựa Pascal”
1.3.1.Quy cách về cấu trúc chương trình
Mỗi chương trình thì được gán một tên để phân biệt
và tên chương trình thì đứng sau từ khóa “Program”


- Độ dài của tên chương trình khơng hạn chế. Sau
tên có thể kèm theo lời thuyết minh được đặt giữa

cặp dấu {…}
1.3.2.Kí tự và biểu thức
- 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ệ: <, >, =,<=, >= ,<>
- Giá trị 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ó dạng:A[i], B[i,j]


1.3.3.Các câu lệnh (hay các chỉ thị)
Các câu lệnh trong chương trình được viết cách
nhau bởi dấu ; bao gồm:
a.Câu lệnh gán
Có dạng: V:=E
Trong đó: V chỉ tên biến hoặc tên hàm
E là biểu thức
Ta cũng có thể dùng phép gán chung:
Ví dụ: A:=B:=1
b.Câu lệnh ghép
Có dạng; Begin S1,S2…Sn; end
Với Si, i=1…n là các câu lệnh


1.3.3.3.Câu lệnh điều kiện
Có dạng; if B then S
Trong đó: B là biểu thức logic

S là kết quả hoặc câu lệnh khác
Có thể diễn tả bởi sơ đồ.
true
S

B

false
Hoặc:

true
S1

B

false

S2


1.3.4.Câu lệnh tuyển
Case
B1: S1;
B2: S2;

Bn-1: Sn-1;
else: Sn
End case
Trong đó: Bi(i=1,2,…n) là các điều kiện
Si(i=1,2,…n) là các câu lệnh

Sơ đồ:
false
false…
false
B1
B2
Bn-1
true
true
true
S1

S2

Sn

Sn-1


1.3.3.5.Câu lệnh lặp
*Lặp với số lần biết trước
For i:=m to n do S
Nhằm thực hiện câu lệnh S với i lấy giá trị nguyên m tới n
(n>=m) với bước nhảy tăng bằng 1
Hoặc : for i :=n down to m do S
*Lặp với số lần không biết trước
While B do S
true
B
S

false
Khi nào B có giá trị bằng True thì thực hiện S
Hoặc : Repeat S until B. Lặp lại S tới khi B nhận giá trị True
true
B
S
false


1.3.3.6.Câu lệnh chuyển
Go to n
Trong đó n là số hiệu của một bước trong chương trình
Hạn chế dùng go to
1.3.3.7.Câu lệnh vào ra
Read (<danh sách biến>)
Write (<danh sách biến hoặc dịng kí tự>)
Chú ý: 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ự được đặt giữa hai
dấu nháy đơn ‘…’
1.3.3.8.Câu lệnh kết thúc chương trình
End


1.3.4.Chương trình con
*Hàm:
Function <tên hàm>(<danh sách biến>)
S1,S2…Sn
Return
Trong đó: S1, S2,…Sn là các lệnh

ở đây là return thay cho end
*Thủ tục
Procedure <tên hàm>(<danh sách tham số>)
S1,S2,…Sn
Return
Chú ý: Lời gọi chương trình con hàm thể hiện bằng tên hàm và
danh sách tham số thực số. Cịn chương trình con thủ tục lời gọi
được thể hiện bằng câu lệnh Call có dạng như sau:
Call<tên thủ tục>(<danh sách tham số thực sự>)


CHƯƠNG II: NGĂN XẾP VÀ HÀNG ĐỢI
I. Ngăn xếp
1. Định nghĩa về ngăn xếp (stack)
Ngăn xếp là một kiểu danh sách tuyến tính đặc biệt mà phép
bổ sung và loại bỏ luôn luôn thực hiện ở một đầu gọi là đỉnh.
Nguyên tắc lưu trữ của stack là vào sau ra trước (LIFO).
Stack có thể rỗng hoặc bao gồm một số phần tử.
2. Lưu trữ danh sách bằng mảng (lưu trữ kế tiếp)
* Trường hợp có 1 stack
S là một vectơ dùng để lưu trữ n phần tử
T là một biến trỏ, khi stack rỗng thì T =0, một phần tử mới được
bổ sung thì T tăng lên 1, loại bỏ một phần tử T giảm đi 1
Mơ hình lưu trữ cấu trúc dữ liệu của stack như sau:
S1

S2

S3


Đáy của stack

S4

S5

S6

S7
T

......

Sn


Giải thuật thêm phần tử vào stack
Procedure Pust(S,T,X)
{xét xem stack có tràn khơng}
If T>=n then begin
write (‘stack đã tràn’)
return
end;
{chuyển con trỏ}
T:=T+1;
{thêm phần tử mới}
S[T]:=X;
Return



Giải thuật loại bỏ phần tử
Procedure Pop (S,T,Y)
{xét xem stack đã rỗng chưa}
If T<=0 then begin
write (‘stack rỗng’);
return
end;
else
{chuyển con trỏ}
T:=T-1;
{loại bỏ phần tử Y}
Y:=S[T+1];
Return


*Trường hợp có 2 stack
- Khơng quy định kích thước tối đa cho từng stack mà
không gian nhớ được dùng chung. Bằng cách đặt 2
stack ở 2 đầu sao cho hướng phát triển của chúng
ngược nhau
đáy 1
đỉnh 1
đỉnh 2 đáy 2
Theo sơ đồ thì 1 trong 2 stack có thể dùng lấn bộ nhớ của
stack kia. Bộ nhớ chỉ tràn khi đã không gian nhớ dành
cho chúng đã dùng hết
*Trường hợp từ 3 stack trở lên:
Đáy1

Đỉnh1


Đáy 2

Đỉnh 2

Đáy 3

Đỉnh 3


2. Ví dụ ứng dụng của Stack
a. Đổi cơ số
Đổi số 54d sang hệ b
Giải thuật chuyển đổi
Program Chuyen
Read (n);
While n<>0 do begin
r:=n mod 2;
call Pust(S,T,R);
n:=n div 2;
end;
While S chưa rỗng do begin
call Pop(S,T,R);
Write (R);
end;
End.


II. Hàng đợi
1. Định nghĩa hàng đợi (queue)

Queue là kiểu danh sách tuyến tính mà phép bổ sung
được thực hiện ở một đầu và loại bỏ ở một đầu khác
Quy tắc lưu trữ của queue là FIFO (vào trước ra trước)
2. Lưu trữ kế tiếp
- Sử dụng một vectơ Q có n phần tử
- R là con trỏ trỏ tới lối trước (phải)
- L là con trỏ trỏ tới lối sau (trái)
- Khi Queue rỗng thì R=L=0, khi bổ sung một phần tử
thì R tăng lên 1, khi loại bỏ một phần tử thì L tăng lên
1


Mơ hình lưu trữ
A
L

A
L

B C D
E
R
Queue ban đầu

B

C D

E


F

R Queue được bổ sung phần tử F

B
L R

C D
E F
Queue bị loại bỏ phần tử A

Hạn chế tình huống các các phần tử của Queue di chuyển khắc không gian nhớ. Vì vậy để khắc
phục người ta coi khơng gian nhớ dành cho Queue theo kiểu vịng trịn theo mơ hình sau:
Q[n] Q[1]

Q[i]


Giải thuật bổ sung phần tử trong Queue
Procedure Them(Q,L,R,X);
{Trường hợp queue đầy}
If L=1 and R=n or L=R+1 then begin
Write (‘đã đầy’);
end;
{chuyển con trỏ}
If L=0 then L:=R:=1
Else
if R=n then R:=1;
else R:=R+1
{thêm X vào queue}

Q[R]:=X;
Return



×