129
A B C D F G E H K CẤU TRÚC DỮ LIỆU VÀ CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040) GIẢI THUẬT (501040)

CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

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

Page 1: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

A

B

C

DF

G

E

H

K

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

Page 2: CẤU TRÚC DỮ LIỆU VÀ 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

Page 3: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 4: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 5: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 6: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 7: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 8: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 9: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 10: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 11: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 12: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 13: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 14: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 15: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 16: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 17: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 18: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 19: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 20: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 21: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 22: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 23: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 24: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 25: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 26: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 27: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 28: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 29: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 30: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 31: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 32: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 33: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 34: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 35: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

A

B

C

DF

G

E

H

K

CẤU 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

Page 36: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 37: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 38: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 39: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 40: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 41: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 42: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 43: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 44: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 45: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 46: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 47: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 48: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 49: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 50: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 51: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 52: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 53: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 54: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 55: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 56: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 57: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 58: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 59: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

A

B

C

DF

G

E

H

K

CẤU 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

Page 60: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 61: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 62: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 63: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 64: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 65: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 66: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 67: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 68: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 69: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 70: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 71: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 72: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 73: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 74: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 75: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 76: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 77: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 78: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 79: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 80: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 81: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

A

B

C

DF

G

E

H

K

CẤU 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

Page 82: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 83: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 84: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 85: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 86: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 87: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 88: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 89: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 90: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 91: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 92: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 93: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 94: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 95: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 96: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 97: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

A

B

C

DF

G

E

H

K

CẤU 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

Page 98: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 99: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 100: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 101: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 102: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 103: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 104: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 105: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 106: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 107: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 108: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 109: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 110: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 111: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 112: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 113: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 114: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 115: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 116: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 117: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 118: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 119: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 120: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 121: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 122: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 123: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 124: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 125: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 126: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 127: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 128: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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

Page 129: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT (501040)

Đ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