4
Ch ng1
CÁCKHÁINI M C N B N
Mônh c:Phântíchvàthi tk gi ithu t
5
N i dung
1. Ki u d li u tr u t ng
2. quy
3. Phân tíchgi i thu t
6
1.Ki u d li utr ut ng
• Mô t m tc utrúcd li utheocáctácv (operations) làm
vi ctrên c utrúc d li uthì ti n l i h n là di n t nó theo
nh ng chiti t thi công (implementation details).
• Chúngtanêntáchnh ngkháini mv c utrúcd li ura
kh i nh ngchiti tthi công.
• Khim tc utrúcd li u c nhngh atheocáchnh
v ytas cóm tki ud li utr ut ng (abstractdata type)
hay ADT.
M tki u d li utr u t ng là m tmôhìnhtoán
h c icùng v inh ngtác v c nhngh atrên
mô hìnhnày.
7
Vàithí d v Ki u d li utr u t ng
• M t t p (set)làm tt ph pg mzero hay nhi uph nt .
M tph nt không cphépxu thi nnhi uh nm t
l ntrongt p. M t t p g m n ph n t cký hi u là {a
1
,
a
2
,…,a
n
},nh ngv trí c am tph nt trongm tt plà
khôngquantr ng.
• M t at p(multiset)làm t t pmàtrong ó m t ph n t
c phép xu t hi nnhi u h n m t l n.Thí d ,{5,7,5,2} là
m t at p. M t a t p có th có nh ngtác v sau:
initialize (kh i t o)
insert (thêm vào)
is_empty (th a t pcór ng)
delete (xoá)
findmin (tìm ph n t bé nh t)
8
Vàithí d v Ki u d li utr u t ng(tt)
• M t chu i (sequence)làm tt ph pcóth t c azero hay
nhi uph nt ; cký hi ulà<a
1
, a
2
,…, a
n
>. V trí c a
m tph nt trongm tchu i là cóý nghiã.M t chu icóth
có nh ngtác v sau:
initialize (kh i t o)
length (chi u dài)
head (ph n t u)
tail (ph n uôi)
concatenate (ghép k hai chu i)
9
Gi i m t bàitoán b ngADT
th y íchl i c aki ud li utr ut ng,th xétbàitoán
sau:
Cho m t m ng(array) g m n s , A[1 n], hãyxác nh k ph n
t l nnh ttrongm ng,v ik n.Thí d , n uA là {5,3, 1, 9,
6}, và k = 3, thì k t qu là {5, 9, 6}.
Không d xây d ng m t gi ithu t gi i bàitoántrên.
Tath dùngki ud li utr ut ng at p(multiset) v i các
tác v :
initialize(M),
insert(x, M),
deleteMin(M),
findMin(M)
10
Suy ngh trên a t pM,tacóth vi t m tgi ithu tnh
sau:
Initialize(M);
for i:= 1 to k do
Insert(A[i],M);
for i:= k+ 1 to n do
if A[i]>FindMin(M) then
begin
DeleteMin(M);Insert(A[i],M)
end;
Trongthí d trên,tath yki ud li utr ut ng ã làm
ngi nhóavi cxây d ng gi ithu tb ngcáchkhông b n
tâm nnh ng chiti tthi cônghayhi nth c hóa.
11
Thicông m tki ud li utr ut ng
Quá trìnhdùngm tc utrúc d li uc th hi nth chóa
m tADT cg ilàthicôngki ud li utr ut ng.Trong
s thi công này, ph n d li utr u t ng c hi nth c hóa
b ng m t c utrúc d li u c th và ph ncáctác v tr u
t ng c hi nth c hóa b ngcáctác v c th h n.
Abstract
Data
Operations
Data
Structure
Concrete
operations
12
Thicông m tki u d li utr u t ng(tt.)
Có th dùng m ng (array) hay danhsáchliênk t(linkedlist)
thicông t ph p(set).
Có th dùng m ng (array) hay danhsáchliên k t (linkedlist)
thi công chu i.
V iki ud li utr ut ng at pnh trongthí d tr c,ta
có th dùng hàng icó utiên (priority queue) thi
công. Và sau ó tacóth dùng c utrúc d li u heap thi
công hàng i có utiên.
13
2. quy
H th ctruyh i
Thí d 1:Hàmtínhgiaith a
N! = N.(N-1)! v iN 1
0!= 1
Nh ng nhngh ahàm quymàch anh ng i s nguyên
cg ilành ng h th ctruyh i(recurrencerelation).
function factorial(N:integer):integer;
begin
if N= 0
then factorial:= 1
else factorial:= N*factorial(N-1);
end;
14
H th ctruy h i
Thí d 2: S Fibonacci
H th ctruyh i:
F
N
= F
N-1
+ F
N-2
for N 2
F
0
= F
1
= 1
1, 1, 2, 3, 5, 8,13, 21, …
function fibonacci(N: integer): integer;
begin
if N<= 1
then fibonacci:= 1
else fibonacci:=fibonacci(N-1)+
fibonacci(N-2);
end;
15
M tcáchkhác:Tacóth dùngm tm ng ch anh ngtr s
itr ctrongkhitínhhàmfibonacci.Tacóm t gi ithu t
không quy.
procedure fibonacci;
const max= 25;
var i:integer;
F: array[0 max] of integer;
begin
F[0]:=1; F[1]:=1;
for i:=2to max do
F[i]:=F[i-1]+ F[i-2]
end;
16
Chi nl cChia- -tr
Nhi ugi ithu thaycóc utrúc quy: gi i m tv n
gi ithu t g i chính nó m thaynhi u l n i phó v i
nh ng v n con (subproblem)cóquanh ch tch v i nhau.
Nh ng gi ithu t nh v ytuântheo cáchti p c n chia- -tr
(divide andconquer):
Gi ithu tphânrãv n thànhnh ngv n con, gi i
nh ngv n con nàyvàk th pnh ngl igi i c anh ng
v n conthànhl igi ichov n nguyênth y.
Chi n l c này bao g m 3 b csau ây m i c p quy:
phân chia (divide)
tr (conquer)
k t h p (combine)
17
Thí d : Xétvi cv chnh ngv chcáchnhau1 inchtrên1
câyth c:cóm tnétv cht i i n½inch,nétv chng n
h n nh ng o n ¼ inch, nét v ch ng n h nn a nh ng
o n1/8inch, v.v
procedure rule(l,r,h: integer);
/*l:left positionoftheruler;r:right
position
oftheruler*/
var m: integer;
begin
if h> 0 then
begin
m:=(1+r) div 2;mark(m, h);
rule(l,m, h-1);
rule(m,r , h-1)
end;
end;
Gi s th t c
mark(x,h) v m t
v ch h n v t i v
trí x.
18
Kh quy
V n :Gi ithu tkhông quy th ng làm vi c h u hi u
và d ki msoát h n1 gi ithu t quy.
Làm cáchnào chuy n i m tch ngtrình quy
thànhm tch ngtrìnhkhông- -quyt ng ng.
Ph ngpháp:
Cho m tth t c quyP, m i l ncóm tl nhg i quy
nP, giá tr hi nhànhc acácthams vàcácbi nc cb
cc tvàocácng nx p(stack) x lý sau.
M i l ncóm ts quay v quyv P,giá tr c acác
tham s và cácbi n c c b s ckhôiph cl i t cácng n
x p.
19
Kh quy(tt.)
Vi c i phó v i ach kh h i (return address) cth c
hi nnh sau:
Gi s th t cPch a m t l nh g i quy t i b c l nh
K, a ch kh h i K+1 s cl ut i m tng nx p và s
c dùng quay v m cth cthith t cP hi n hành.
procedure hanoi(n, beg,aux, end);
begin
if n= 1 then writeln(beg, end)
else
begin
hanoi(n-1, beg, end, aux) ;
writeln(beg, end);
hanoi(n-1, aux, beg, end);
end
end;
Thí d :Th t c
hanoi là m tth
t c quygi i bài
toánThápHàN i
20
procedure hanoi(n,beg,aux,end:
integer);
/*StacksSTN,STBEG,STAUX,
STEND,andSTADDcorrespond,
respectively,tovariablesN,BEG,AUX,
ENDandADD*/
label 1,3,5;
var t: integer;
begin
top:=0; /*preparation forstacks*/
1: if n=1then
begin writeln(beg,end); goto 5 end;
top:= top+1; /* firstrecursivecall*/
STN[top]:=n;STBEG[top]:=beg;
STAUX [top]:=aux;
STEND [top]:=end;
STADD [top]:=3;
/*savingreturnaddress*/
n:=n-1; t:=aux;aux:=end;
end:= t;
goto 1;
3:writeln(beg,end);
top:= top+1; /*second
recursivecall*/
STN[top]:=n;
STBEG[top]:=beg;
STAUX[top]:aux;
STEND[top]:=end;
STADD[top]:=5;
/*savingreturnaddress*/
n:=n-1; t:=beg;beg:=aux;
aux:= t; goto 1;
5. /* translationofreturnpoint*/
if top<>0then
begin
n:=STN[top];
beg:=STBEG [top];
aux:=STAUX [top];
end:=STEND [top];
add:=STADD [top];
top:= top – 1; goto add
end
end;
21
S duy tcây quy
Cách ngi nnh t duy tcácnúttrongm tcâynh
phântheo th t n i là nh m tth t c quynh sau:
//duy tth t n i(Inordertraversal)
type
link=node;
node=record
info: …….; l,r:link
end;
procedure traverse(t: link);
begin
if t<> z then /*zisdummy node */
begin
traverse(t.l);
visit(t);
traverse(t.r)
end
end;
22
Th t cduy tcâyti nth t (Pre-order)
procedure traverse(t:link)
begin
if t<> z then
begin
visit(t);
traverse(t.1);traverse(t.r)
end
end;
Tr ckhikh quyth t cnày,tacóth lo i b l nh g i
quyth haid dàngvìkhôngcómãch ngtrình isau
nó.
L nh g i quyth haicóth cchuy nthànhm tl nh
goto nh sau:
23
Kh quy uôi
procedure traverse(t:link);
label 0,1;
begin
0: if t= z thengoto 1;
visit(t);
traverse(t. l);
t:= t.r; goto 0;
1: end;
K thu tnày cg i là kh quy uôi (tail-recursion
removal).
24
procedure traverse(t: link);
label 0, 1, 2, 3;
begin
0:if t=zthen goto 1;
visit(t);
push(t); t:= t.l; goto 0;
3:t:= t.r; goto 0;
1: if stack_empty thengoto 2;
t:= pop; goto 3;
2: end;
Chúý: Doch có m t ach kh h i, 3,màlàc nh,nên
takhôngph i nh i nó vàostack.
Bâygi ápd ng ph ngphápt ngquát,tacóth kh l nh
g i quycònl itrongch ngtrình.
25
procedure traverse(t: link);
label 0,2;
begin
0: while t<> z do
begin
visit(t);
push(t.r);t:= t.1;
end;
if stack_empty thengoto 2;
t:=pop; goto 0;
2: end;
Ta có th lo i b vàiphát bi u goto b ngcáchdùng vòngl p
while nh sau.
26
procedure traverse(t: link);
begin
push(t);
repeat
t:= pop;
while t<> z do
begin
visit(t);
push(t.r);t:= t.l;
end;
until stack_empty;
end;
M tl nn atacóth lo i b hail nh goto cònl i b ngcách
dùngvòngl prepeat .
27
procedure traverse(t: link);
begin
push(t);
repeat
t:= pop;
if t<>zthen
begin
visit(t);
push(t.r); push(t.1);
end;
until stack_empty;
end;
Haivòngl pl ngnhaucóth c ngi nhóa
nh sau:
28
tránh anh ngcâycon r ngvàostack,tacóth s a
ch ngtrìnhtrênthành:
procedure traverse(t: link);
begin
push(t);
repeat
t:= pop;
visit(t);
if t.r<> z then push(t.r);
if t.l<> z then push(t.l);
until stack_empty;
end;
ây là ch ngtrìnhkhông quy hoàn ch nh duy t cây
nh phân.