Tải bản đầy đủ (.pdf) (349 trang)

Phân tích và thiết kế giải thuật doc

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

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.

×