Upload
lesley-dyer
View
63
Download
0
Embed Size (px)
DESCRIPTION
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040). Giới thiệu. Môn học giới thiệu: Các cấu trúc dữ liệu cơ bản Các giải thuật điển hình trên các cấu trúc dữ liệu đó Dùng phương pháp hướng đối tượng. Ngôn ngữ lập trình minh hoạ: Mã giả (pseudocode) C++ (không được giảng dạy chính thức trong môn học). - PowerPoint PPT Presentation
Citation preview
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 2Khoa Cocircng nghệ Thocircng tin
Giới thiệu
Mocircn học giới thiệuCaacutec cấu truacutec dữ liệu cơ bản
Caacutec giải thuật điển higravenh trecircn caacutec cấu truacutec dữ liệu đoacute
Dugraveng phương phaacutep hướng đối tượng
Ngocircn ngữ lập trigravenh minh hoạMatilde giả (pseudocode)
C++ (khocircng được giảng dạy chiacutenh thức trong mocircn học)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 3Khoa Cocircng nghệ Thocircng tin
Nội dung
Chương 1 Tổng quanChương 2 StackChương 3 QueueChương 4 Đệ quiChương 5 List vagrave StringChương 6 Cacircy nhị phacircnChương 7 Tigravem kiếmChương 8 Sắp xếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 4Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 4
Một số thuật ngữ căn bản
Một chương trigravenh maacutey tiacutenh (computer program) lagrave tập caacutec cacircu lệnh để điều khiển một maacutey tiacutenh sinh ra một kết quả cụ thể
Viết caacutec chương trigravenh maacutey tiacutenh gọi lagrave lập trigravenh maacutey tiacutenh (computer programming)
Ngocircn ngữ để tạo caacutec chương trigravenh maacutey tiacutenh gọi lagrave ngocircn ngữ lập trigravenh
Software lagrave một chương trigravenh hay tập hợp caacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 5Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 5
Ngocircn ngữ maacutey
Cấp thấp nhất Caacutec chương trigravenh bao gồm 0 1
Lập trigravenh bằng ngocircn ngữ maacutey coacute thể điều khiển trực tiếp đến phần cứng maacutey tiacutenh
Viacute dụ
00101010 000000000001 000000000010
10011001 000000000010 000000000011
Instruction part (opcode ndash taacutec vụ được thực hiện)
address parts (địa chỉ bộ nhớ của dữ liệu
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 2Khoa Cocircng nghệ Thocircng tin
Giới thiệu
Mocircn học giới thiệuCaacutec cấu truacutec dữ liệu cơ bản
Caacutec giải thuật điển higravenh trecircn caacutec cấu truacutec dữ liệu đoacute
Dugraveng phương phaacutep hướng đối tượng
Ngocircn ngữ lập trigravenh minh hoạMatilde giả (pseudocode)
C++ (khocircng được giảng dạy chiacutenh thức trong mocircn học)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 3Khoa Cocircng nghệ Thocircng tin
Nội dung
Chương 1 Tổng quanChương 2 StackChương 3 QueueChương 4 Đệ quiChương 5 List vagrave StringChương 6 Cacircy nhị phacircnChương 7 Tigravem kiếmChương 8 Sắp xếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 4Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 4
Một số thuật ngữ căn bản
Một chương trigravenh maacutey tiacutenh (computer program) lagrave tập caacutec cacircu lệnh để điều khiển một maacutey tiacutenh sinh ra một kết quả cụ thể
Viết caacutec chương trigravenh maacutey tiacutenh gọi lagrave lập trigravenh maacutey tiacutenh (computer programming)
Ngocircn ngữ để tạo caacutec chương trigravenh maacutey tiacutenh gọi lagrave ngocircn ngữ lập trigravenh
Software lagrave một chương trigravenh hay tập hợp caacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 5Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 5
Ngocircn ngữ maacutey
Cấp thấp nhất Caacutec chương trigravenh bao gồm 0 1
Lập trigravenh bằng ngocircn ngữ maacutey coacute thể điều khiển trực tiếp đến phần cứng maacutey tiacutenh
Viacute dụ
00101010 000000000001 000000000010
10011001 000000000010 000000000011
Instruction part (opcode ndash taacutec vụ được thực hiện)
address parts (địa chỉ bộ nhớ của dữ liệu
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 3Khoa Cocircng nghệ Thocircng tin
Nội dung
Chương 1 Tổng quanChương 2 StackChương 3 QueueChương 4 Đệ quiChương 5 List vagrave StringChương 6 Cacircy nhị phacircnChương 7 Tigravem kiếmChương 8 Sắp xếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 4Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 4
Một số thuật ngữ căn bản
Một chương trigravenh maacutey tiacutenh (computer program) lagrave tập caacutec cacircu lệnh để điều khiển một maacutey tiacutenh sinh ra một kết quả cụ thể
Viết caacutec chương trigravenh maacutey tiacutenh gọi lagrave lập trigravenh maacutey tiacutenh (computer programming)
Ngocircn ngữ để tạo caacutec chương trigravenh maacutey tiacutenh gọi lagrave ngocircn ngữ lập trigravenh
Software lagrave một chương trigravenh hay tập hợp caacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 5Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 5
Ngocircn ngữ maacutey
Cấp thấp nhất Caacutec chương trigravenh bao gồm 0 1
Lập trigravenh bằng ngocircn ngữ maacutey coacute thể điều khiển trực tiếp đến phần cứng maacutey tiacutenh
Viacute dụ
00101010 000000000001 000000000010
10011001 000000000010 000000000011
Instruction part (opcode ndash taacutec vụ được thực hiện)
address parts (địa chỉ bộ nhớ của dữ liệu
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 4Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 4
Một số thuật ngữ căn bản
Một chương trigravenh maacutey tiacutenh (computer program) lagrave tập caacutec cacircu lệnh để điều khiển một maacutey tiacutenh sinh ra một kết quả cụ thể
Viết caacutec chương trigravenh maacutey tiacutenh gọi lagrave lập trigravenh maacutey tiacutenh (computer programming)
Ngocircn ngữ để tạo caacutec chương trigravenh maacutey tiacutenh gọi lagrave ngocircn ngữ lập trigravenh
Software lagrave một chương trigravenh hay tập hợp caacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 5Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 5
Ngocircn ngữ maacutey
Cấp thấp nhất Caacutec chương trigravenh bao gồm 0 1
Lập trigravenh bằng ngocircn ngữ maacutey coacute thể điều khiển trực tiếp đến phần cứng maacutey tiacutenh
Viacute dụ
00101010 000000000001 000000000010
10011001 000000000010 000000000011
Instruction part (opcode ndash taacutec vụ được thực hiện)
address parts (địa chỉ bộ nhớ của dữ liệu
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 5Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 5
Ngocircn ngữ maacutey
Cấp thấp nhất Caacutec chương trigravenh bao gồm 0 1
Lập trigravenh bằng ngocircn ngữ maacutey coacute thể điều khiển trực tiếp đến phần cứng maacutey tiacutenh
Viacute dụ
00101010 000000000001 000000000010
10011001 000000000010 000000000011
Instruction part (opcode ndash taacutec vụ được thực hiện)
address parts (địa chỉ bộ nhớ của dữ liệu
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 6Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 6
Assembly languages
Thực hiện cugraveng nhiệm vụ ngocircn ngữ maacutey nhưng sử dụng tecircn tượng trưng cho opcode vagrave caacutec toaacuten tử thay vigrave 1 0
LOAD BASEPAY
ADD OVERPAY
STORE GROSSPAY
Chương trigravenh ngocircn ngữ assembly phải được dịch sang ngocircn ngữ maacutey trước khi coacute thể thực thi bởi maacutey tiacutenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 7Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 7
Assembler
Translation program
(assembler)
Assemblylanguageprogram
Machine language program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 8Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 8
Ngocircn ngữ lập trigravenh cấp cao
Sử dụng caacutec cacircu lệnh dễ hiểu hơn
Caacutec chương trigravenh sử dụng ngocircnn ngữ cấp cao phải được dịch sang ngocircn ngữ cấp thấp bằng caacutech sử dụng một chương trigravenh gọi lagrave compiler
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 9Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 9
High-level Programming Languages (cont)
Cho pheacutep người lập trigravenh viết caacutec cacircu lệnh như cacircu tiếng Anh vagrave caacutec kiacute hiệu toaacuten học thocircng dụng
Mỗi dograveng trong chương trigravenh ngocircn ngữ mức cao gọi lagrave cacircu lệnh
Example Result = (First + Second)Third
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 10Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 10
Phần mềm ứng dụng vagrave phần mềm hệ thống
2 loại chương trigravenh maacutey tiacutenh
Application software bao gồm những chương trigravenh được viết để thực thi caacutec nhiệm vụ cụ thể được yecircu cầu bởi user
bull System software lagrave tập caacutec chươg trigravenh phải luocircn được sẵn sagraveng đến bất kigrave hệ thống maacutey tiacutenh cho noacute vận hagravenh (hệ điều hagravenh bộ chuyển đổi ngocircn ngữ)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 11Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 11
PROGRAMMING LANGUAGES
Một số ngocircn ngữ thocircng dụng FORTRAN 1957
COBOL 1960s
BASIC 1960s
PASCAL 1971 Structure programming
C
C++ Object-oriented programming
Java
Cuacute phaacutep (syntax) Cuacute phaacutep của một ngocircn ngữ lập trigravenh lagrave tập caacutec luật để viết caacutec cacircu
lệnh chiacutenh xaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 12Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 12
The C Programming Language In the 1970s at Bell Laboratories Dennis Ritchie and Brian Kernighan designed the C programming language
C was used exclusively on UNIX and on mini-computers During the 1980s C compilers were written for other flatforms including PCs
To provide a level of standardization for C language in 1989 ANSI created a standard version of C called ANSI C
One main benefit of C it is much closer to assembly language other than other high-level programming languages
The programs written in C often run faster and more efficiently than programs written in other high-level programming language
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 13Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 13
The C++ Programming Language In 1985 at Bell Laboratories Bjarne Stroutrup created C++ based on the C language C++ is an extension of C that adds object-oriented programming capabilities
C++ is now the most popular programming language for writing programs that run on Windows and Macintosh
The standardized version of C++ is referred to as ANSI C++
The ANSI standards also define run-time libraries which contains useful functions variables constants and other programming items that you can add to your programs
The ANSI C++ run-time library is called Standard Template Library or Standard C++ Library
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 14Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 14
Giải thuậtDugraveng C++ để diễn tả coacute vấn đề
Coacute thể diễn tả giải thuật bằng caacutech sử dụng flowchart
Flow chart thể hiện neacutet phaacutet thảo cấu truacutec căn bản vagrave tiacutenh logic của chương trigravenh
Một caacutech khaacutec để diễn tả giải thuật lagrave sử dụng matilde giả pseudocode
Giả lập thường lagrave dễ hiểu khocircng chi tiết đến caacutec kỹ thuật lập trigravenh
Ở cấp độ hết sức tổng quaacutet gần ngocircn ngữ tự nhiecircn
Hoặc rất chi tiết như dugraveng ngocircn ngữ tựa Pascal tựa C++
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 15Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất quan trọng của giải thuật lagrave
1048766 Hữu hạn (finiteness) giải thuật phải luocircn luocircn kết thuacutec sau một số hữu hạn bước
1048766 Xaacutec định (definiteness) mỗi bước của giải thuật phải được xaacutec định rotilde ragraveng vagrave phải được thực hiện chiacutenh xaacutec nhất quaacuten
1048766 Hiệu quả (effectiveness) caacutec thao taacutec trong giải thuật phải được thực hiện trong một lượng thời gian hữu hạn
ndash Ngoagravei ra một giải thuật cograven phải coacute đầu vagraveo (input) vagrave đầu ra (output)
Giải thuật (Algorithm)15
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 16Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 16
Flowchart symbols
Terminal Inputoutput Process Flowlines Decision
Connector
Predefined process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 17Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 17
Example
Start
Input Name Hours Rate
Calculate Pay Hours Rate
Dislay Name Pay
End
Note Name Hours and Pay are variables in the program
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 18Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 18
Algorithms in pseudo-code
Sử dụng caacutec cụm từ như tiếng Anh để mocirc tả pseudocode
Example
Input the three values into the variables Name Hours Rate
Calculate Pay = Hours Rate
Display Name and Pay
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 19Khoa Cocircng nghệ Thocircng tin
Programming Fundamentals 19
LoopsNote
1 Loop is a very important concept in programming
2 NUM NUM + 1 means
old value of NUM + 1 becomes new value of NUM
Start
NUM 4
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
NUMgt 9
STOP
No
Yes
The algorithm can be described in pseudocode as follows
NUM 4
do
SQNUM NUM2
Print NUM SQNUM
NUM NUM + 1
while (NUM lt= 9)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 20Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng matilde giả
Viacute dụ Matilde giả của bubble sort
Giải thuật 1 Giải thuật 2
Algorithm Bubble sort
Input The list A of n elements is given
Output The list A is sorted
1 loop for n time
11 for each pair in the list
111 if it is not in ordered
1111 exchange them
End Bubble sort
Algorithm Bubble sort
Input The list A of n elements is given Output The list A is sorted
1 for outter in 0(n-2) 11 for inner in 0(n-2- outter) 111 if Ainner+1 lt Ainner 1111 swap Ainner Ainner+1
End Bubble sort
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 21Khoa Cocircng nghệ Thocircng tin
Giải thuật bằng ngocircn ngữ lập trigravenh
Viacute dụ Lập trigravenh cụ thể Bubble sort
Giải thuật 1 Pascal Giải thuật 2 C++procedure BubbleSort(var A list) var ij int begin for i = 1 to n-1 do for j = 1 to (n-1-i) do if A[j+1] lt A[j] then begin tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp end end
void BubbleSort(list A) int i j
for (i=0 i lt n-2 i++) for (j=0 jlt(n-2-i) j++) if (A[j+1] lt A[j]) tmp = A[j] A[j] = A[j+1]
A[j+1] = tmp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 22Khoa Cocircng nghệ Thocircng tin
So saacutenh matilde giả vagrave NNLT
Nhận xeacutet Matilde giả 1 gần với caacutech trao đổi của con người nhất nhưng khoacute lập trigravenh nhấtMatilde giả 2 dễ lập trigravenh hơn
Phương phaacutepĐầu tiecircn caacutech giải quyết vấn đề bằng maacutey tiacutenh số (giải thuật bằng matilde giả)Sau đoacute ngocircn ngữ lập trigravenh cụ thể
HọcNhớ giải thuật (matilde giả)Dugraveng NNLT cụ thể để minh chứng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 23Khoa Cocircng nghệ Thocircng tin
Giải bagravei toaacuten bằng phần mềm
1 Xaacutec định bagravei toaacuten
2 Thiết kế phần mềm
3 Thiết kế dữ liệu
4 Thiết kế vagrave phacircn tiacutech giải thuật
5 Lập trigravenh vagrave gỡ rối
6 Kiểm tra phần mềm
7 Bảo trigrave
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 24Khoa Cocircng nghệ Thocircng tin
Lập trigravenh hướng đối tượng (OOP)
Chương trigravenh = tập caacutec đối tượng tương taacutec nhau
Đối tượng (object) = thuộc tiacutenh + taacutec vụ
entry
đối tượng (object)
local data of object
local data of operation
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 25Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng
Kiểu trừu tượng (abstract type) định nghĩa interface (tập caacutec entry)
EntryTecircn method
Danh saacutech tham số higravenh thức
Đặc tả chức năng
Chưa coacute dữ liệu becircn trong chưa dugraveng được
Chỉ dugraveng để thiết kế yacute niệm
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 26Khoa Cocircng nghệ Thocircng tin
Hiện thực vagrave sử dụng
Class hiện thực của abstract typeĐịnh nghĩa caacutec dữ liệuĐịnh nghĩa caacutec phương thức + hagravem phụ trợ (nội bộ)Định nghĩa caacutec phương phức lsquoconstructorrsquo vagrave lsquodestructorrsquo nếu cần
Đối tượng = một instance của một classThocircng điệp (message)
dugraveng tương taacutec lẫn nhau = lời gọi phương thức của caacutec đối tượng
Student aStudent aStudentprint()
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 27Khoa Cocircng nghệ Thocircng tin
Cấu truacutec dữ liệu
(1) Lagrave một caacutech tổ chức vagrave lưu trữ dữ liệu hợp lyacute để sử dụng một caacutech hiệu quả
(2) Tập caacutec thao taacutec để truy cập caacutec thagravenh phần dữ liệu
Viacute dụMảng (Array)
Danh saacutech liecircn kết (Linked List)
Ngăn xếp (Stack)
Hagraveng đợi (Queue)
Cacircy (Tree)
hellip
(1) the logical arrangement of data elements combined with
(2) the set of operations we need to access the elements
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 28Khoa Cocircng nghệ Thocircng tin
Mối quan hệ của CTDL vagrave thuật toaacuten
CTDL + Thuật toaacuten = Chương trigravenh
28
bull Cấu truacutec dữ liệu cụ thể chọn giải thuậtbull Giải thuật cụ thể chọn cấu truacutec dữ liệubull Khi coacute cấu truacutec dữ liệu tốt vagrave giải thuật phugrave hợp thigrave xacircy
dựng chương trigravenh chỉ phụ thuộc thời gianbull Một chương trigravenh maacutey tiacutenh chỉ hoagraven thiện khi coacute đầy
đủ cấu truacutec dữ liệu vagrave giải thuật
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 29Khoa Cocircng nghệ Thocircng tin
Kiểu dữ liệu trừu tượng vagrave cấu truacutec dữ liệu
Abstract data type ột định nghĩa mức cao caacutec kiểu dữ liệu
Tập caacutec dữ liệu
Tập caacutec thao taacutec trecircn dữ liệu hoặc tập con dữ liệu
Khocircng thể hiện caacutech hiện thực becircn trong
Cấu truacutec dữ liệu Cụ thể hơn một kỹ thuật hay chiến slược để hiện thực abstract data type
Viacute dụ abstract stack (push pop isEmpty size)Sử dụng array hay danh saacutech liecircn kết để hiện thực lớp stack (ArrayStack)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 30Khoa Cocircng nghệ Thocircng tin
Đặc điểm của OOP
Tiacutenh bao đoacutengChe dấu cấu truacutec dữ liệu becircn trong
Che dấu caacutech thức hiện thực đối tượng
Kế thừaĐịnh nghĩa thecircm caacutec dữ liệu vagrave phương thức cần thiết từ một class coacute sẵn
Cho pheacutep overrideoverload
Cho pheacutep dugraveng thay thế vagrave khả năng dynamic biding
Bao gộpMột đối tượng chứa nhiều đối tượng khaacutec
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 31Khoa Cocircng nghệ Thocircng tin
Cấu truacutec của đối tượng
method
methodmethod
Internal function
Internal function
Internal data
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 32Khoa Cocircng nghệ Thocircng tin
class Student private
int StudentIDstring StudentName
publicStudent()Student(const Student amp)~Student()void operator=(const Student
amp)void print()
void main() Student aStudentsStudentprint()
Khai baacuteo một class trecircn C++
constructor
copy constructor
destructor
overload assignment operator
gọi phương thức
khai baacuteo dữ liệu becircn trong
phương thức (hagravenh vi)
khai baacuteo một đối tượng
khai baacuteo một lớp mới
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 33Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa
1 Ghi chuacute vagraveo đầu mỗi hagravem(a) Người lập trigravenh ngagravey bản sao
(b) Mục điacutech của hagravem
(c) Input output
(d) Caacutec chỉ dẫn đến caacutec tagravei liệu khaacutec (nếu coacute)
Coacute thể dugraveng dạng Precondition vagrave Postcondition
2 Ghi chuacute vagraveo mỗi biến hằng kiểu
3 Ghi chuacute vagraveo mỗi phần của chương trigravenh
4 Ghi chuacute mỗi khi dugraveng caacutec kỹ thuật đặc biệt
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 34Khoa Cocircng nghệ Thocircng tin
Dugraveng ghi chuacute lagravem rotilde nghĩa ndash Viacute dụvoid Lifeupdate() Pre grid đang chứa một trạng thaacutei của thực thể sống Post grid sẽ chứa trạng thaacutei tiến hoacutea mới của thực thể sống nagravey int row col int new_grid[maxrow + 2][maxcol + 2] Chứa trạng thaacutei mới vagraveo đacircy for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) switch (neighbor_count(row col)) case 2 Trạng thaacutei của tế bagraveo khocircng đổi new_grid[row][col] = grid[row][col] break case 3 Tế bagraveo sẽ sống new_grid[row][col] = 1 break default Tế bagraveo sẽ chết new_grid[row][col] = 0 for (row = 1 row lt= maxrow row++) for (col = 1 col lt= maxcol col++) grid[row][col] = new_grid[row][col] Cập nhật caacutec tế bagraveo cugraveng luacutec
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 2 StackChương 2 Stack
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 36Khoa Cocircng nghệ Thocircng tin
Mocirc tả stack
Một stack lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo vagrave loại bỏ được thực hiện tại một đầu (gọi lagrave đỉnh ndash top của stack)
Lagrave một dạng vagraveo sau ra trước ndash LIFO (Last In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 37Khoa Cocircng nghệ Thocircng tin
Viacute dụ về stack
Stack rỗng
Đẩy (push) Q vagraveo
Đẩy A vagraveo
Lấy (pop) ra một =gt được A
Lấy ra một =gt được Q vagrave stack rỗng
Q
Q
A
Q
A
Q
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 38Khoa Cocircng nghệ Thocircng tin
Ứng dụng Đảo ngược danh saacutech
Yecircu cầu Đảo ngược một danh saacutech nhập vagraveo
Giải thuật
1 Lặp lại n lần
11 Nhập vagraveo một giaacute trị
12 Đẩy noacute vagraveo stack
2 Lặp khi stack chưa rỗng
21 Lấy một giaacute trị từ stack
22 In ra
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 39Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Viacute dụCần nhập 4 số vagraveoBan đầu Nhập 1
1
Nhập 5
1
5
Nhập 7
1
5
7
Nhập 3
1
5
7
3
Lấy ra =gt 3
1
5
7
3
Lấy ra =gt 7
1
5
7
Lấy ra =gt 5
1
5
Lấy ra =gt 1
1
Stack đatilde rỗngNgừng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 40Khoa Cocircng nghệ Thocircng tin
Đảo ngược danh saacutech ndash Matilde C++include ltstackgtusing namespace std
int main( ) int n double item stackltdoublegt numbers cout ltlt Bao nhieu so nhap vao cin gtgt n for (int i = 0 i lt n i++) cin gtgt item numberspush(item) while (numbersempty( )) cout ltlt numberstop( ) ltlt numberspop( )
sử dụng STL(Standard Template Library)
khai baacuteo một stack coacute kiểu dữ liệu của caacutec phacircn tử becircn trong lagrave double
đẩy một số vagraveo trong stack
kiểm tra xem stack coacute khaacutec rỗng khocircng
lấy giaacute trị trecircn đỉnh của stack rastack khocircng đổi
lấy giaacute trị trecircn đỉnh của stack ra khỏi stackđỉnh của stack bacircy giờ lagrave giaacute trị kế tiếp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 41Khoa Cocircng nghệ Thocircng tin
Kiểu trừu tượng (abstract data type)
ĐN1 Một kiểu (type)một tập hợp
mỗi thagravenh phần của tập hợp nagravey lagrave caacutec giaacute trị (value)
Viacute dụ int float char lagrave caacutec kiểu cơ bản
ĐN2 Một datildey của kiểu Tcoacute chiều dagravei bằng 0 lagrave rỗng
coacute chiều dagravei n (ngt=1) bộ thứ tự (Sn-1 t)Sn-1 datildey coacute chiều dagravei n-1 thuộc kiểu T
t lagrave một giaacute trị thuộc kiểu T
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 42Khoa Cocircng nghệ Thocircng tin
Stack trừu tượng
Một stack kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo stack rỗng (create)
2 Kiểm tra rỗng (empty)
3 Đẩy một giaacute trị vagraveo trecircn đỉnh của stack (push)
4 Bỏ giaacute trị đang coacute trecircn đỉnh của stack (pop)
5 Lấy giaacute trị trecircn đỉnh của stack stack khocircng đổi (top)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 43Khoa Cocircng nghệ Thocircng tin
Thiết kế stack
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Stack public
Stack() constructorbool empty() const kiểm tra rỗngError_code push(const Entry ampitem) đẩy item vagraveoError_code pop() bỏ phần tử trecircn đỉnhError_code top(Entry ampitem) lấy giaacute trị trecircn đỉnhkhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 44Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool StackltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu stack hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code StackltEntrygtpush(const Entry ampitem)Pre Khocircng coacutePost Nếu stack hiện tại khocircng đầy item sẽ được thecircm vagraveo đỉnh của stack Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygtpop() constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave stack khocircng đổi
template ltclass EntrygtError_code StackltEntrygttop(Entry ampitem) constPre Khocircng coacutePost Nếu stack hiện tại khocircng rỗng đỉnh của stack hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị fail của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 45Khoa Cocircng nghệ Thocircng tin
Hiện thực stack liecircn tục
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 46Khoa Cocircng nghệ Thocircng tin
Khai baacuteo stack liecircn tục
const int maxstack = 10 small number for testing
template ltclass Entrygtclass Stack public
Stack( )bool empty( ) constError_code pop( )Error_code top(Entry ampitem) constError_code push(const Entry ampitem)
privateint countEntry entry[maxstack]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 47Khoa Cocircng nghệ Thocircng tin
Đẩy một phần tử vagraveo stack
Giải thuật1 Nếu cograven chỗ trống trong stack
11 Tăng vị triacute đỉnh lecircn 1
12 Chứa giaacute trị vagraveo vị triacute đỉnh của stack
13 Tăng số phần tử lecircn 1
top
1
5
7
count=2count=3
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 48Khoa Cocircng nghệ Thocircng tin
Bỏ phần tử trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Giảm vị triacute đỉnh đi 112 Giảm số phần tử đi 1
top
1
5
7
count=3count=2
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 49Khoa Cocircng nghệ Thocircng tin
ThecircmBỏ phần tử - Matilde C++template ltclass EntrygtError_code StackltEntrygt push(const Entry ampitem)
if (count gt= maxstack)return overflow
elseentry[count++] = item
return success
template ltclass EntrygtError_code StackltEntrygt pop()
if (count == 0)return underflow
elsecount--
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 50Khoa Cocircng nghệ Thocircng tin
Lấy giaacute trị trecircn đỉnh stack
Giải thuật1 Nếu cograven phần tử trong stack
11 Trả về giaacute trị tại vị triacute đỉnh
Matilde C++template ltclass EntrygtError_code StackltEntrygt top(Entry ampitem)
if (count == 0)return underflow
elseitem = entry[count - 1]
return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 51Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator
Mocirc tả bagravei toaacutenCaacutec toaacuten hạng được đọc vagraveo trước vagrave đẩy vagraveo stack
Khi đọc vagraveo toaacuten tử lấy hai toaacuten hạng ra từ stack tiacutenh toaacuten với toaacuten tử nagravey rồi đẩy kết quả vagraveo stack
Thiết kế phần mềmCần một stack để chứa toaacuten hạng
Cần hagravem get_command để nhận lệnh từ người dugraveng
Cần hagravem do_command để thực hiện lệnh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 52Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Thiết kế chức năng
Tập lệnhlsquorsquo đọc một giaacute trị rồi đẩy vagraveo stack
Toaacuten tử lsquo+rsquo lsquo-rsquo lsquorsquo lsquorsquo lấy 2 giaacute trị trong stack tiacutenh toaacuten vagrave đẩy kết quả vagraveo stack
Toaacuten tử lsquo=rsquo in đỉnh của stack ra
lsquoqrsquo kết thuacutec chương trigravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 53Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Viacute dụ
Ban đầu
Tiacutenh toaacuten biểu thức 3 5 + 2 =
Toaacuten tử Nhập vagraveo 3
3
Toaacuten tử Nhập vagraveo 5
3
5
Toaacuten tử +Lấy ra 5 vagrave 3Tiacutenh 3 + 5 =gt 8
3
5
Đẩy 8 vagraveo
8
Toaacuten tử Lấy ra 2 vagrave 8Tiacutenh 8 2 =gt 16
8
Đẩy vagraveo 16
16
Toaacuten tử =In ra 16
16
Toaacuten tử Nhập vagraveo 2
8
2 2
16
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 54Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem get_command
char get command( ) char command bool waiting = true cout ltlt Select command and press lt Enter gt while (waiting) cin gtgt command command = tolower(command) if (command == lsquorsquo || command == lsquo=lsquo || command == lsquo+rsquo || command == lsquominusrsquo|| command == lsquorsquo || command == lsquorsquo || command == lsquoqrsquo) waiting = false else cout ltlt Please enter a valid command ltlt endl ltlt []push to stack [=]print top ltltendl ltlt [+] [minus] [] [] are arithmetic operations ltlt endl ltlt [Q]uit ltlt endl return command
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 55Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Giải thuật tiacutenh toaacuten với toaacuten tử
Algorithm Op_processInput toaacuten tử op stack chứa caacutec toaacuten hạngOutput stack chứa caacutec toaacuten hạng sau khi tiacutenh xong toaacuten tử op
1 Nếu stack khocircng rỗng 11 Lấy đỉnh stack ra thagravenh p 12 Bỏ phần tử trecircn đỉnh stack 13 Nếu stack rỗng
131 Đẩy p ngược lại132 Baacuteo lỗi vagrave thoaacutet
14 Lấy đỉnh stack ra thagravenh q 15 Bỏ phần tử trecircn đỉnh stack 16 Tiacutenh toaacuten (q op p) 17 Đẩy kết quả vagraveo stack
End Op_process
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 56Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Matilde C++ cho toaacuten tử cộng
if (numberstop(p) == underflow) cout ltlt Stack rỗngelse numberspop( ) if (numberstop(q) == underflow) cout ltlt Stack chỉ coacute 1 trịrdquo numberspush(p) else numberspop( ) if (numberspush(q + p) == overflow) cout ltlt Stack đầyrdquo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 57Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndash Chương trigravenh chiacutenh
include stackcpp
prototypevoid introduction( )void instructions( )char get_command( )bool do_command(char command Stackltdoublegt ampnumbers)
int main( ) Stackltdoublegt stored_numbersintroduction( ) instructions( )while (do_command(get_command( ) stored_numbers))
implementationhellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 58Khoa Cocircng nghệ Thocircng tin
Reverse Polish Calculator ndashHagravem do_command
bool do_command(char command Stack ampnumbers) double p q switch (command) case rsquo cout ltlt Enter a real number ltlt flush cin gtgt p if (numberspush(p) == overflow) cout ltlt Warning Stack full lost number ltlt endl break case =lsquo if (numberstop(p) == underflow) cout ltlt Stack empty ltlt endl else cout ltlt p ltlt endl break
Add options for further user commands case lsquoqrsquo cout ltlt Calculation finishedn return false return true
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 3 QueueChương 3 Queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 60Khoa Cocircng nghệ Thocircng tin
Mocirc tả queue
Một queue lagrave một cấu truacutec dữ liệu magrave việc thecircm vagraveo được thực hiện ở một đầu (rear) vagrave việc lấy ra được thực hiện ở đầu cograven lại (front)
Phần tử vagraveo trước sẽ ra trước ndash FIFO (First In First Out)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 61Khoa Cocircng nghệ Thocircng tin
Queue trừu tượng
Một queue kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo queue rỗng (create)
2 Kiểm tra rỗng (empty)
3 Thecircm một giaacute trị vagraveo cuối của queue (append)
4 Bỏ giaacute trị đang coacute ở đầu của queue (serve)
5 Lấy giaacute trị ở đầu của queue queue khocircng đổi (retrieve)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 62Khoa Cocircng nghệ Thocircng tin
Thiết kế queue
enum Error_code fail success overflow underflow
template ltclass Entrygtclass Queue public
Queue() constructorbool empty() const kiểm tra rỗngError_code append(const Entry ampitem) đẩy item vagraveoError_code serve() bỏ 1 phần tử ở đầuError_code retrieve(Entry ampitem) lấy giaacute trị ở đầukhai baacuteo một số phương thức cần thiết khaacutec
privatekhai baacuteo dữ liệu vagrave hagravem phụ trợ chỗ nagravey
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 63Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thứctemplate ltclass Entrygtbool QueueltEntrygtempty() constPre Khocircng coacutePost Trả về giaacute trị true nếu queue hiện tại lagrave rỗng ngược lại thigrave trả về false
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)Pre Khocircng coacutePost Nếu queue hiện tại khocircng đầy item sẽ được thecircm vagraveo cuối của queue Ngược lại trả về giaacute trị overflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtserve() constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ bị hủy bỏ Ngược lại trả về giaacute trị underflow của kiểu Error_code vagrave queue khocircng đổi
template ltclass EntrygtError_code QueueltEntrygtretrieve(Entry ampitem) constPre Khocircng coacutePost Nếu queue hiện tại khocircng rỗng đầu của queue hiện tại sẽ được cheacutep vagraveo tham biến item Ngược lại trả về giaacute trị underflow của kiểu Error_code
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 64Khoa Cocircng nghệ Thocircng tin
Mở rộng queue
Coacute thecircm caacutec taacutec vụKiểm tra đầy (full)Tiacutenh kiacutech thước (size)Giải phoacuteng queue (clear)Lấy giaacute trị ở đầu vagrave bỏ ra khỏi queue (serve_and_retrieve)
Matilde C++template ltclass Entrygtclass Extended_queue public QueueltEntrygt public
bool full( ) constint size( ) constvoid clear( )Error_code serve_and_retrieve(Entry ampitem)
Coacute caacutec khả năng public protected private
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 65Khoa Cocircng nghệ Thocircng tin
Tiacutenh thừa hưởng
Dugraveng tiacutenh thừa hưởngExtended_queue coacute đầy đủ caacutec thagravenh phần của Queue
Thecircm vagraveo đoacute caacutec thagravenh phần riecircng của migravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 66Khoa Cocircng nghệ Thocircng tin
Queue liecircn tục
Dugraveng một array Coacute xu hướng dời về cuối arrayHai caacutech hiện thực đầu tiecircn
Khi lấy một phần tử ra thigrave đồng thời dời hagraveng lecircn một vị triacute
Chỉ dời hagraveng về đầu khi cuối hagraveng khocircng cograven chỗ
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tửdời tất cả về trước
Thecircm vagraveo 1 phần tử
A B C D B C D B C D E
Ban đầu Lấy ra 1 phần tử Thecircm vagraveo 1 phần tử dời tất cả về trước để trống chỗ thecircm vagraveo
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 67Khoa Cocircng nghệ Thocircng tin
Queue lagrave array vograveng (circular array)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 68Khoa Cocircng nghệ Thocircng tin
Array vograveng với ngocircn ngữ C++
Xem array như lagrave một vograveng phần tử cuối của array nối với phần tử đầu của array
Tiacutenh toaacuten vị triacute kềi = ((i + 1) == max) 0 (i + 1)
if ((i + 1) == max) i = 0 else i = i + 1
i = (i + 1)max
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 69Khoa Cocircng nghệ Thocircng tin
Điều kiện biecircn của queue vograveng
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 70Khoa Cocircng nghệ Thocircng tin
Một số caacutech hiện thực queue liecircn tục
Một array với front lagrave phần tử đầu vagrave tất cả caacutec phần tử sẽ được dời lecircn khi lấy ra một phần tửMột array coacute hai chỉ mục luocircn tăng chỉ đến phần tử đầu vagrave cuốiMột array vograveng coacute chỉ mục front vagrave rear vagrave một ocirc luocircn trốngMột array vograveng coacute chỉ mục front vagrave rear vagrave một cờ (flag) cho biết queue lagrave đầy (rỗng) chưaMột array vograveng với chỉ mục front vagrave rear coacute caacutec giaacute trị đặc biệt cho biết queue đang rỗngMột array vograveng với chỉ mục front vagrave rear vagrave một số chứa số phần tử của queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 71Khoa Cocircng nghệ Thocircng tin
Hiện thực queue liecircn tục
const int maxqueue = 10 small value for testing
template ltclass Entrygtclass Queue public
Queue( )bool empty( ) constError_code serve( )Error_code append(const Entry ampitem)Error_code retrieve(Entry ampitem) const
protectedint countint front rearEntry entry[maxqueue]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 72Khoa Cocircng nghệ Thocircng tin
Khởi tạo vagrave kiểm tra rỗng
Khởi tạotemplate ltclass Entrygt
QueueltEntrygtQueue( )
count = 0
rear = maxqueue minus 1
front = 0
Kiểm tra rỗngtemplate ltclass Entrygt
bool QueueltEntrygtempty( ) const
return count == 0
Dugraveng biến count để biết số phần tử trong queue
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 73Khoa Cocircng nghệ Thocircng tin
Thecircm một giaacute trị vagraveo queue
Giải thuật1 Nếu hagraveng đầy
11 Baacuteo lỗi overflow
2 Tiacutenh toaacuten vị triacute cuối mới theo array vograveng
3 Gaacuten giaacute trị vagraveo vị triacute cuối mới nagravey
4 Tăng số phần tử lecircn 1
4 Baacuteo success
A B C
front rear
D
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 74Khoa Cocircng nghệ Thocircng tin
Loại một giaacute trị khỏi queue
Giải thuật1 Nếu hagraveng rỗng
11 Baacuteo lỗi underflow2 Tiacutenh toaacuten vị triacute đầu mới theo array vograveng3 Giảm số phần tử đi 13 Baacuteo success
A B C D
front rear
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 75Khoa Cocircng nghệ Thocircng tin
Thecircmloại một giaacute trị ndash Matilde C++
template ltclass EntrygtError_code QueueltEntrygtappend(const Entry ampitem)
if (count gt= maxqueue) return overflowcount++rear = ((rear + 1) == maxqueue) 0 (rear + 1)entry[rear] = itemreturn success
template ltclass EntrygtError_code QueueltEntrygtserve()
if (count lt= 0) return underflowcountminusminusfront = ((front + 1) == maxqueue) 0 (front +
1)return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 76Khoa Cocircng nghệ Thocircng tin
Ứng dụng Giả lập phi trường
Mocirc tả1 Sử dụng hagraveng đợi runway cho việc cất vagrave hạ caacutenh
2 Một maacutey bay coacute thể cất hoặc hạ caacutenh trong một đơn vị thời gian
3 Tại một thời điểm số maacutey bay đến lagrave ngẫu nhiecircn
4 Maacutey bay hạ caacutenh được ưu tiecircn trước maacutey bay cất caacutenh
5 Caacutec maacutey bay chờ cấthạ caacutenh được chứa vagraveo caacutec hagraveng đợi tương ứng vagrave với số lượng giới hạn
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 77Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hagraveng đợi
enum Runway_activity idle land takeoff
class Runway public
Runway(int limit)Error_code can_land(const Plane ampcurrent)Error_code can_depart(const Plane ampcurrent)Runway_activity activity(int time Plane ampmoving)void shut_down(int time) const
privateExtended queue landingExtended queue takeoffint queue_limithellip
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 78Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Hạ caacutenh
Error_code Runway can_land(const Plane ampcurrent) Error_code resultif (landingsize( ) lt queue_limit)
result = landingappend(current)else
result = failnum_land_requests++if (result = success)
num_land_refused++else
num_land_accepted++return result
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 79Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Xử lyacute
Runway_activity Runwayactivity(int time Plane ampmoving) Runway_activity in_progressif (landingempty( ))
landingretrieve(moving)in_progress = landlandingserve( )
else if (takeoffempty( )) takeoffretrieve(moving)in_progress = takeofftakeoffserve( )
elsein_progress = idle
return in_progress
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 80Khoa Cocircng nghệ Thocircng tin
Giả lập phi trường ndash Giả lậpfor (int current_time = 0 current_time lt end_time current_time++)
int number_arrivals = variablepoisson(arrival_rate)for (int i = 0 i lt number_arrivals i++)
Plane current_plane(flight_number++ current_time arriving)if (small_airportcan_land(current_plane) = success)
current_planerefuse( )int number_departures = variablepoisson(departure_rate)for (int j = 0 j lt number_departures j++)
Plane current_plane(flight_number++ current_time departing)if (small_airportcan_depart(current_plane) = success)
current_planerefuse( )Plane moving_planeswitch (small_airportactivity(current_time moving_plane))
case land moving_planeland(current_time) breakcase takeoff moving_planefly(current_time) breakcase idle run_idle(current_time)
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 4 Đệ quiChương 4 Đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 82Khoa Cocircng nghệ Thocircng tin
Khaacutei niệm đệ qui
Khaacutei niệm (định nghĩa) đệ qui coacute dugraveng lại chiacutenh noacute
Viacute dụ giai thừa của n lagrave 1 nếu n lagrave 0 hoặc lagrave n nhacircn cho giai thừa của n-1 nếu n gt 0
Quaacute trigravenh đệ qui gồm 2 phầnTrường hợp cơ sở (base case)Trường hợp đệ qui cố gắng tiến về trường hợp cơ sở
Viacute dụ trecircnGiai thừa của n lagrave 1 nếu n lagrave 0Giai thừa của n lagrave n (giai thừa của n-1) nếu ngt0
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 83Khoa Cocircng nghệ Thocircng tin
Tiacutenh giai thừa
Định nghĩa khocircng đệ quin = n (n-1) hellip 1
Định nghĩa đệ quin = 1 nếu n=0
n (n-1) nếu ngt0
Matilde C++int factorial(int n)
if (n==0) return 1
else return (n factorial(n - 1))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 84Khoa Cocircng nghệ Thocircng tin
Thi hagravenh hagravem tiacutenh giai thừa
n=2
hellip 2factorial(1)
factorial (2)
n=1
hellip 1factorial(0)
factorial (1)
n=0
hellip return 1
factorial (0)
1
1
6
2
n=3
hellip 3factorial(2)
factorial (3)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 85Khoa Cocircng nghệ Thocircng tin
Trạng thaacutei hệ thống khi thi hagravenh hagravem tiacutenh giai thừa
factorial(3) factorial(3)
factorial(2)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(1)
factorial(0)
factorial(3)
factorial(2)
factorial(1)
factorial(3)
factorial(2)
factorial(3)
t
Gọi hagravemfactorial(3)
Gọi hagravemfactorial(2)
Gọi hagravemfactorial(1)
Gọi hagravemfactorial(0)
Trả về từ hagravemfactorial(0)
Trả về từ hagravemfactorial(1)
Trả về từ hagravemfactorial(2)
Trả về từ hagravemfactorial(3)
Stack hệ thống
Thời gian hệ thống
t
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 86Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội
LuậtDi chuyển mỗi lần một đĩa
Khocircng được đặt đĩa lớn lecircn trecircn đĩa nhỏ
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 87Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thiết kế hagravem
Hagravem đệ quiChuyển (count-1) đĩa trecircn đỉnh của cột start sang cột temp
Chuyển 1 đĩa (cuối cugraveng) của cột start sang cột finish
Chuyển count-1 đĩa từ cột temp sang cột finish
magic
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 88Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Matilde C++
void move(int count int start int finish int temp) if (count gt 0)
move(count minus 1 start temp finish) cout ltlt Move disk ltlt count ltlt from ltlt start ltlt to ltlt finish ltlt ltlt endl move(count minus 1 temp finish start)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 89Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 90Khoa Cocircng nghệ Thocircng tin
Bagravei toaacuten Thaacutep Hagrave nội ndash Cacircy đệ qui
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 91Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec giải thuật đệ qui
Tigravem bước chiacutenh yếu (bước đệ qui)
Tigravem qui tắc ngừng
Phaacutec thảo giải thuậtDugraveng cacircu lệnh if để lựa chọn trường hợp
Kiểm tra điều kiện ngừngĐảm bảo lagrave giải thuật luocircn dừng lại
Vẽ cacircy đệ quiChiều cao cacircy ảnh hưởng lượng bộ nhớ cần thiết
Số nuacutet lagrave số lần bước chiacutenh yếu được thi hagravenh
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 92Khoa Cocircng nghệ Thocircng tin
Đệ qui đuocirci (tail recursion)
Định nghĩa cacircu lệnh thực thi cuối cugraveng lagrave lời gọi đệ qui đến chiacutenh noacute
Khử chuyển thagravenh vograveng lặp
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 93Khoa Cocircng nghệ Thocircng tin
Khử đệ qui đuocirci hagravem giai thừa
Giải thuậtproduct=1
for (int count=1 count lt n count++)
product = count
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 94Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci
Định nghĩa F0 = 0
F1 = 1
Fn = Fn-1 + Fn-2 khi ngt2
Viacute dụ 0 1 1 2 3 5 8 13 21 34 hellipHagravem đệ qui
int fibonacci (int n) if (nlt=0) return 0if (n==1) return 1else return (fibonacci(n-1) + fibonacci(n-2))
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 95Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Cacircy thi hagravenh
Đatilde tiacutenh rồi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 96Khoa Cocircng nghệ Thocircng tin
Datildey số Fibonacci ndash Khử đệ qui
Nguyecircn tắcDugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-2
Dugraveng biến lưu trữ giaacute trị đatilde tiacutenh của Fn-1
Tiacutenh Fn = Fn-1 + Fn-2 vagrave lưu lại để dugraveng cho lần sau
Giải thuật
int Fn2=0 Fn1=1 Fn
for (int i = 2 i lt= n i++)
Fn = Fn1 + Fn2
Fn2 = Fn1 Fn1 = Fn
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
A
B
C
DF
G
E
H
K
CẤU TRUacuteC DỮ LIỆU VAgrave CẤU TRUacuteC DỮ LIỆU VAgrave GIẢI THUẬT (501040)GIẢI THUẬT (501040)
Chương 5 Danh saacutech vagrave chuỗiChương 5 Danh saacutech vagrave chuỗi
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 98Khoa Cocircng nghệ Thocircng tin
Danh saacutech trừu tượng
Một danh saacutech (list) kiểu TMột datildey hữu hạn kiểu T
Một số taacutec vụ1 Khởi tạo danh saacutech rỗng (create)
2 Kiểm tra rỗng (empty)
3 Kiểm tra đầy (full)
4 Tiacutenh kiacutech thước (size)
5 Xoacutea rỗng danh saacutech (clear)
6 Thecircm một giaacute trị vagraveo danh saacutech tại một viacute triacute cụ thể (insert)
7 Lấy một giaacute trị tại một vị triacute cụ thể ra khỏi danh saacutech (remove)
8 Nhận về giaacute trị tại một vị triacute cụ thể (retrieve)
9 Thay thế một giaacute trị tại một vị triacute cụ thể (replace)
10 Duyệt danh saacutech vagrave thi hagravenh một taacutec vụ tại mỗi vị triacute (traverse)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 99Khoa Cocircng nghệ Thocircng tin
Thiết kế caacutec phương thức
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 100Khoa Cocircng nghệ Thocircng tin
Chỉ số caacutec phần tử
Đaacutenh chỉ số một danh saacutech coacute n phần tửĐaacutenh chỉ số từ 0 1 hellip caacutec phần tử
Viacute dụ a0 a1 a2 hellip an-1
Phần tử aidx đứng sau aidx-1 vagrave trước aidx+1 (nếu coacute)
Dugraveng chỉ sốTigravem thấy một phần tử trả về vị triacute (chỉ số) của noacute
Thecircm vagraveo một phần tử tại vị triacute idx thigrave chỉ số caacutec phần tử cũ từ idx trở về sau đều tăng lecircn 1
Chỉ số nagravey được dugraveng bất kể danh saacutech được hiện thực thế nagraveo ở cấp vật lyacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 101Khoa Cocircng nghệ Thocircng tin
Phương thức insert vagrave remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 102Khoa Cocircng nghệ Thocircng tin
Phương thức retrieve vagrave replace
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 103Khoa Cocircng nghệ Thocircng tin
Phương thức traverse vagrave tham số hagravem
void print_int(int ampx) cout ltlt x ltlt ldquo rdquo void increase_int(int ampx) x++
void main() Listltintgt alisthellipalisttraverse(print_int)hellipalisttraverse(increase_int)hellip
Khi gọi tham số hagravem chương trigravenh dịch phải nhigraven thấy hagravem được gọi
Tugravey theo mục điacutech magrave gọicaacutec hagravem khaacutec nhau
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 104Khoa Cocircng nghệ Thocircng tin
Hiện thực danh saacutech liecircn tụctemplate ltclass List_entrygtclass List public
methods of the List ADTList( )int size( ) constbool full( ) constbool empty( ) constvoid clear( )void traverse(void (visit)(List_entry amp))Error_code retrieve(int position List_entry ampx) constError_code replace(int position const List_entry ampx)Error_code remove(int position List_entry ampx)Error_code insert(int position const List_entry ampx)
protected data members for a contiguous list implementationint countList_entry entry[max_list]
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 105Khoa Cocircng nghệ Thocircng tin
Thecircm vagraveo một danh saacutech liecircn tục
insert(3 lsquozrsquo)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
z
count=8count=9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 106Khoa Cocircng nghệ Thocircng tin
Giải thuật thecircm vagraveo một danh saacutech liecircn tục
Algorithm InsertInput position lagrave vị triacute cần thecircm vagraveo x lagrave giaacute trị cần thecircm vagraveoOutput danh saacutech đatilde thecircm vagraveo x
1 if list đầy 11 return overflow2 if position nằm ngoagravei khoảng [0count] 21 return range_error Dời tất cả caacutec phần tử từ position về sau 1 vị triacute3 for index = count-1 down to position 31 entry[index+1] = entry[index]4 entry[position] = x Gaacuten x vagraveo vị triacute position5 count++ Tăng số phần tử lecircn 16 return success
End Insert
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 107Khoa Cocircng nghệ Thocircng tin
Matilde C++ thecircm vagraveo một danh saacutech liecircn tục
template ltclass List_entrygtError_code ListltList_entrygt insert(int position const List_entry ampx)
if (full( ))return overflow
if (position lt 0 || position gt count)return range_error
for (int i = count minus 1 i gt= position iminusminus)entry[i + 1] = entry[i]
entry[position] = xcount++return success
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 108Khoa Cocircng nghệ Thocircng tin
Xoacutea từ một danh saacutech liecircn tục
x
remove(3 x)
da b c
0 1 2 3 4 5 6 7 8 9
e f g hd e f g h
count=8count=7
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 109Khoa Cocircng nghệ Thocircng tin
Giải thuật xoacutea từ một danh saacutech liecircn tục
Algorithm RemoveInput position lagrave vị triacute cần xoacutea bỏ x lagrave giaacute trị lấy ra đượcOutput danh saacutech đatilde xoacutea bỏ phần tử tại position
1 if list rỗng 11 return underflow2 if position nằm ngoagravei khoảng [0count-1] 21 return range_error3 x = entry[position] Lấy x tại vị triacute position ra4 count-- Giảm số phần tử đi 1 Dời tất cả caacutec phần tử từ position về trước 1 vị triacute5 for index = position to count-1 51 entry[index] = entry[index+1]6 return success
End Remove
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 110Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt một danh saacutech liecircn tục
Algorithm TraverseInput hagravem visit dugraveng để taacutec động vagraveo từng phần tửOutput danh saacutech được cập nhật bằng hagravem visit
Queacutet qua tất cả caacutec phần tử trong list1 for index = 0 to count-1 11 Thi hagravenh hagravem visit để duyệt phần tử entry[index]
End Traverse
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 111Khoa Cocircng nghệ Thocircng tin
Matilde C++ duyệt một danh saacutech liecircn tục
template ltclass List_entrygtvoid ListltList_entrygt traverse(void (visit)(List_entry amp)) Post Taacutec vụ cho bởi hagravem visit sẽ được thi hagravenh tại mỗi thagravenh phần của list bắt đầu từ vị triacute 0 trở đi
for (int i = 0 i lt count i++)(visit)(entry[i])
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 112Khoa Cocircng nghệ Thocircng tin
Chuỗi (string)
Chuỗi lagrave một datildey caacutec kyacute tự
Viacute dụldquoThis is a stringrdquo lagrave 1 chuỗi coacute 16 kyacute tự
ldquordquo lagrave một chuỗi rỗng (coacute 0 kyacute tự)
Chuỗi trừu tượngCoacute thể xem lagrave danh saacutech
Coacute caacutec taacutec vụ thường dugravengSao cheacutep (strcpy)
Nối kết (strcat)
Tiacutenh chiều dagravei (strlen)
So saacutenh 2 chuỗi (strcmp)
Tigravem một chuỗi trong chuỗi khaacutec (strstr)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 113Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn
Cacircy nhị phacircnCacircy rỗng
Hoặc coacute một node gọi lagrave gốc (root) vagrave 2 cacircy con gọi lagrave cacircy con traacutei vagrave cacircy con phải
Viacute dụCacircy rỗng
Cacircy coacute 1 node lagrave node gốc
Cacircy coacute 2 node
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 114Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec
MứcNode gốc ở mức 0Node gốc của caacutec cacircy con của một node ở mức m lagrave m+1
Chiều caoCacircy rỗng lagrave 0Chiều cao lớn nhất của 2 cacircy con cộng 1(Hoặc mức lớn nhất của caacutec node cộng 1)
Đường đi (path)Tecircn caacutec node của quaacute trigravenh đi từ node gốc theo caacutec cacircy con đến một node nagraveo đoacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 115Khoa Cocircng nghệ Thocircng tin
Caacutec định nghĩa khaacutec (tt)
Node trước sau cha conNode x lagrave trước node y (node y lagrave sau node x) nếu trecircn đường đi đến y coacute x
Node x lagrave cha node y (node y lagrave con node x) nếu trecircn đường đi đến y node x nằm ngay trước node y
Node laacute trung gianNode laacute lagrave node khocircng coacute cacircy con nagraveo
Node trung gian khocircng lagrave node gốc hay node laacute
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 116Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec
Cacircy nhị phacircn đầy đủ gần đầy đủĐầy đủ caacutec node laacute luocircn nằm ở mức cao nhất vagrave caacutec nuacutet khocircng lagrave nuacutet laacute coacute đầy đủ 2 nhaacutenh conGần đầy đủ Giống như trecircn nhưng caacutec node laacute nằm ở mức cao nhất (hoặc trước đoacute một mức) vagrave lấp đầy từ becircn traacutei sang becircn phải ở mức cao nhất
Chiều cao của cacircy coacute n nodeTrung bigravenh h = [lg n] + 1Đầy đủ h = lg (n + 1)Suy biến h = n
Số phần tử tại mức i nhiều nhất lagrave 2i
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 117Khoa Cocircng nghệ Thocircng tin
Pheacutep duyệt cacircy
Duyệt qua từng node của cacircy (mỗi node 1 lần)
Caacutech duyệtChiacutenh thức NLR LNR LRN NRL RNL RLN
Chuẩn NLR (preorder) LNR (inorder) LRN (postorder)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 118Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy NLR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
AKết quả B D H I N E J O K C F L P G M
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 119Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LNR
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả D N I B J O E K A F P L C M G
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 120Khoa Cocircng nghệ Thocircng tin
Viacute dụ về pheacutep duyệt cacircy LRN
A
B
D
H I
N
E
J K
O
C
F
L
P
G
M
HKết quả N I D O J K E B P L F M G C A
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 121Khoa Cocircng nghệ Thocircng tin
Cacircy liecircn kết
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 122Khoa Cocircng nghệ Thocircng tin
Giải thuật duyệt cacircy inorder
Algorithm recursive_inorder Input subroot lagrave con trỏ node gốc vagrave hagravem visit Output kết quả pheacutep duyệt
1 if (cacircy con khocircng rỗng) 11 Call recursive_inorder với nhaacutenh traacutei của subroot 12 Duyệt node subroot bằng hagravem visit 13 Call recursive_inorder với nhaacutenh phải của subroot
End recursive_inorder
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 123Khoa Cocircng nghệ Thocircng tin
Cacircy nhị phacircn tigravem kiếm ndash Binary search tree (BST)
Một cacircy nhị phacircn tigravem kiếm (BST) lagrave một cacircy nhị phacircn rỗng hoặc mỗi node của cacircy nagravey coacute caacutec đặc tiacutenh sau
1 Khoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của tất cả caacutec node của cacircy con becircn traacutei (hay becircn phải)
2 Caacutec cacircy con (becircn traacutei phải) lagrave BST
Tiacutenh chấtChỉ cần đặc tiacutenh 1 lagrave đủ
Duyệt inorder sẽ được danh saacutech coacute thứ tự
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 124Khoa Cocircng nghệ Thocircng tin
Viacute dụ BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Duyệt inorder 1 3 5 6 10 12 13 18 20 25 29 32 35 37 41 50
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 125Khoa Cocircng nghệ Thocircng tin
Caacutec tiacutenh chất khaacutec của BST
Node cực traacutei (hay phải)Xuất phaacutet từ node gốc
Đi sang traacutei (hay phải) đến khi khocircng đi được nữa
Khoacutea của node cực traacutei (hay phải) lagrave nhỏ nhất (hay lớn nhất) trong BST
BST lagrave cacircy nhị phacircn coacute tiacutenh chấtKhoacutea của node gốc lớn (hay nhỏ) hơn khoacutea của node cực traacutei (hay cực phải)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 126Khoa Cocircng nghệ Thocircng tin
Tigravem kiếm trecircn BST
Chọn hướng tigravem theo tiacutenh chất của BSTSo saacutenh với node gốc nếu đuacuteng thigrave tigravem thấy
Tigravem becircn nhaacutenh traacutei (hay phải) nếu khoacutea cần tigravem nhỏ hơn (hay lớn hơn) khoacutea của node gốc
Giống phương phaacutep tigravem kiếm nhị phacircn
Thời gian tigravem kiếmTốt nhất vagrave trung bigravenh O(lg n)
Tệ nhất O(n)
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 127Khoa Cocircng nghệ Thocircng tin
Giải thuật tigravem kiếm trecircn BST
Algorithm BST_search Input subroot lagrave node gốc vagrave target lagrave khoacutea cần tigravem Output node tigravem thấy
1 if (cacircy rỗng) 11 return not_found2 if (target trugraveng khoacutea với subroot) 21 return subroot3 if (target coacute khoacutea nhỏ hơn khoacutea của subroot) 31 Tigravem becircn nhaacutenh traacutei của subroot4 else 41 Tigravem becircn nhaacutenh phải của subroot
End BST_search
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 128Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 13
Khaacutec nhauGiống nhauNode gốc nhỏ hơnNode gốc lớn hơn
Tigravem thấySố node duyệt 5Số lần so saacutenh 9
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10
ĐH Baacutech Khoa TpHCM Giới thiệu mocircn học 129Khoa Cocircng nghệ Thocircng tin
Viacute dụ tigravem kiếm trecircn BST
25
10
3
1 6
5
18
12 20
13
37
29
35
32
50
41
Tigravem kiếm 14
Khaacutec nhauNode gốc nhỏ hơnNode gốc lớn hơn
Khocircng tigravem thấySố node duyệt 5Số lần so saacutenh 10