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
…
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 { 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
• M t chu i (sequence)làm tt ph pc th t c azero hay
nhi
uph nt ; cký hi ulà<a
1
2
…
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 ng
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] ãyxác nh k ph n
t
l nnh ttrongm ng ik n.Thí d uA là {5
6} à k thì k t qu là {5 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
deleteMin(M
findMin(M)
10
Suy ngh tr n a t pM tacóth vi t m tgi ithu tnh
sau:
(
for 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
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àmtnhgiaith a
N
= N.(N-1 v iN 1
= 1
Nh
ng nhngh ahàm quymàch anh ng i s nguyên
cg ilành ng h th ctruyh i(recurrencerelation)
function (
begin
if
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
( 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 ctrongkhitnhhàmfibonacci.Tacóm t gi ithu t
không
quy.
procedure
const 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 cChi 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 chi tr
divide andconque :
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 csau ây m i c p qu
phân chia (divid
tr (conque
k t h p (combin
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
( 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, 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(sta 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
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 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
↑
record
…… ; 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 orde
procedure (
begin
if
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 s
23
Kh quy uôi
procedure (
label
begin
if 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 ecursion
removal).
24
procedure ( 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 ,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 ( 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 ( 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 ( 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à
procedure ( 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.