Beruflich Dokumente
Kultur Dokumente
d l d l
MP TemaV Diseodealgoritmositerativoscorrectos
1. Derivacin
1
Derivacindealgoritmos
de algoritmos
2. Diseodealgoritmoscorrectosconbucles
3. Diseodebuclesmediantedebilitamiento
de su postcondicin
desupostcondicin
4. Diseodealgoritmositerativosms
complejos
5. Aplicacinaldiseodealgoritmositerativos
Aplicacin al diseo de algoritmos iterativos
debsquedaenunatabla
6 Aplicacinaldiseodealgoritmosde
6.
li i l di d l i
d
ordenacininternadeunatabla
MP TemaV Diseodealgoritmositerativoscorrectos
1 Derivacindealgoritmos
1.
Derivacin de algoritmos
Disear el siguiente algoritmo
Disearelsiguientealgoritmo
{x=A y=B}
???
{x=B y=A}
MP TemaV Diseodealgoritmositerativoscorrectos
MP TemaV Diseodealgoritmositerativoscorrectos
Hagamosqueelvalordelavariable<y>
Hagamos
que el valor de la variable <y> seaelque
sea el que
debefinalmentetenerfinalmente,esdecir,<A>:
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y=A}
???
{x=B y=A}
MP TemaV Diseodealgoritmositerativoscorrectos
Slofaltamodificarelvalordelavariable<x>
Slo
falta modificar el valor de la variable <x> paraque
para que
valga<B>,sinalterarelvalorde<y>:
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y=A}
x:=x y;
{x=B y=A}
???
{x=B y=A}
Escorrectoeldiseorealizado?
MP TemaV Diseodealgoritmositerativoscorrectos
Eldiseoestconcluidoyescorrecto(regladel
El diseo est concluido y es correcto (regla del
debilitamientodelapostcondicin)!
{x=A y=B}
x:=x+y;
{x=A+B y=B}
y:=x y;
{x=A+B y
{
y=A}
}
x:=x y;
{x=B y=A}
{x=B y=A}
MP TemaV Diseodealgoritmositerativoscorrectos
Heaquelalgoritmodeducidoporderivacin
He
aqu el algoritmo deducido por derivacin del
del
cdigoapartirdesuespecificacin:
{x=A y=B}
x:=x+y;
y:=x y;
x:=x y;
{x=B y=A}
MP TemaV Diseodealgoritmositerativoscorrectos
Hagamosunsegundodiseo,modificandoenprimer
Hagamos
un segundo diseo modificando en primer
lugarelvalordelavariable<y>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
???
{
{x=B
y=A}
}
MP TemaV Diseodealgoritmositerativoscorrectos
Hagamosqueelvalordelavariable<x>
Hagamos
que el valor de la variable <x> seaiguala
sea igual a
<B>,sinmodificarelvalordelavariable<y>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
x:=x y;
{
{x=B
y=AB}
}
???
{x=B y
{
y=A}
}
MP TemaV Diseodealgoritmositerativoscorrectos
10
Slofaltamodificarelvalordelavariable<y>
Slo
falta modificar el valor de la variable <y> paraque
para que
valga<A>,sinalterarelvalorde<x>:
{x=A y=B}
y:=x
y:
x y;
{x=A y=AB}
x:=x y;
{
{x=B
y=AB}
}
y:=x+y;
{x=B y
{
y=A}
}
Hemossabidoderivar
Hemos
sabido derivar unsegundodiseodel
un segundo diseo del
algoritmo!
MP TemaV Diseodealgoritmositerativoscorrectos
11
2 Diseodealgoritmoscorrectosconbucles
2.
Diseo de algoritmos correctos con bucles
Disear el siguiente algoritmo con un bucle:
Disearelsiguientealgoritmoconunbucle:
{P}
???
{Q}
MP TemaV Diseodealgoritmositerativoscorrectos
12
13
Paso 1.
1 El predicado invariante <I> puede deducirse en
muchos casos aplicando tcnicas de debilitamiento de
la postcondicin <Q>.
<Q>
MP TemaV Diseodealgoritmositerativoscorrectos
14
MP TemaV Diseodealgoritmositerativoscorrectos
15
Pasos 3 y 4.
4 Deducimos la condicin <C> del bucle y el
cdigo posterior al bucle:
{P}
Accin_previa
(2)
{I}
mientrasQue C hacer {I}
(1),(3)
???
finMQ
{C I}
Accin_p
posterior
disearestecdigo(4)
g
( )
{Q}
MP TemaV Diseodealgoritmositerativoscorrectos
16
Pasos 5 y 6.
6 Diseamos el cdigo interior del bucle,
bucle
garantizando su terminacin mediante una funcin de
cota:
{P}
Accin_previa
( )
(2)
{I}
mientrasQue
Q
Chacer {I}
{
} {
{f_cota
_
}(1),(3),(6)
}
( ),( ),( )
{ I C}
Accin_a_iterar
disearestecdigo(5)
{ I}
finMQ
{ I C}
Accin_posterior
(4)
{Q}
MP TemaV Diseodealgoritmositerativoscorrectos
17
3 Diseo
3.
Diseodebuclesmediantedebilitamiento
de bucles mediante debilitamiento
desupostcondicin
Derivar un diseo iterativo del siguiente algoritmo:
{cierto}
???
{sumar(T)=([1,N].T[])}
MP TemaV Diseodealgoritmositerativoscorrectos
18
MP TemaV Diseodealgoritmositerativoscorrectos
19
Paso 1.
1 Debilitamos la postcondicin sustituyendo la constante
<N> por una variable, por ejemplo, <hasta>, y el resultado de la
funcin <sumar(T)>
( ) por una variable, por ejemplo <suma>:
{cierto}
{
}
???
mientrasQue ???hacer {I:suma =([1,hasta].T[])}
???
finMQ
???
{sumar(T) =([1,N].T[])}
MP TemaV Diseodealgoritmositerativoscorrectos
20
Paso 2.
2 Procedemos a disear las acciones previas al bucle:
{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue ???hacer {I:suma=([1,hasta].T[])}
???
finMQ
???
{sumar(T)=([1,N].T[])}
MP TemaV Diseodealgoritmositerativoscorrectos
21
Pasos 3 y 4.
4 Deducimos ahora la condicin del bucle y el cdigo
posterior al bucle:
{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue not (hasta=N)hacer
{I:suma=([1,hasta].T[])}
???
finMQ
Q
{suma=([1,hasta].T[]) hasta=N }
devuelvesuma;
{
{sumar(T)=([1,N].T[])}
(T) ( [1 N] T[ ])}
MP TemaV Diseodealgoritmositerativoscorrectos
22
Pasos 5 y 6.
6 Deducimos el cdigo interior al bucle e identificamos
una funcin de cota que asegure su terminacin:
{cierto}
hasta:=1;suma:=T[1];
{suma=([1,hasta].T[])}
mientrasQue not (hasta=N)hacer {f_cota =N hasta}
{suma=([1,hasta].T[]) hastaN }
hasta:=hasta+1;suma:=suma+T[hasta];
{
{suma=([1,hasta].T[])}
(
[ ,
] [ ]) }
finMQ
{suma=([1,hasta].T[]) hasta=N }
de el e suma;
devuelve
{sumar(T)=([1,N].T[])}
MP TemaV Diseodealgoritmositerativoscorrectos
23
24
MP TemaV Diseodealgoritmositerativoscorrectos
25
}
???
finMQ
???
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos
26
Paso 1.
1 Debilitamos la postcondicin sustituyendo el valor
constante
<numDatos(f)>
por
el
valor
variable
<numLedos(f)>:
( )
{cierto}
{
}
???
mientrasQue ???hacer
{I:modo(f) Lec
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
???
finMQ
???
{suma=([1 numDatos(f)] dato(f ))}
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos
27
Paso 2.
2 Procedemos a disear las acciones previas al bucle:
{cierto}
iniciarLectura(f);suma:=0.0;
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))}
mientrasQue ???hacer
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
suma=([1 numLedos(f)] dato(f ))}
???
finMQ
???
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos
28
Pasos 3 y 4.
4 Deducimos ahora la condicin del bucle y el cdigo
posterior al bucle:
{cierto}
iniciarLectura(f);suma:=0.0;
{suma=([1 numLedos(f)] dato(f ))}
{suma=([1,numLedos(f)].dato(f,))}
mientrasQue not finFichero(f) hacer
{I:modo(f)=Lec
suma=([1,numLedos(f)].dato(f,))}
???
finMQ
Q
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))
finFichero(f)
finFichero(f)=(numLedos(f)=numDatos(f)) }
nula;{vamosaeliminarlaporserinnecesaria}
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos
29
Pasos 5 y 6.
6 Deducimos el cdigo interior al bucle e identificamos
una funcin de cota que asegure su terminacin:
{cierto}
iniciarLectura(f);suma:=0 0;
iniciarLectura(f);suma:=0.0;
{suma=([1,numLedos(f)].dato(f,))}
mientrasQue not finFichero(f)hacer
{f_cota =numDatos(f) numLedos(f)}
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))
finFichero(f)
( )
finFichero(f)=(numLedos(f)numDatos(f))}
leer(f,nuevo);suma:=suma+nuevo;
{modo(f)=Lec suma=([1,numLedos(f)].dato(f,))}
suma=([1 numLedos(f)] dato(f ))}
finMQ
{suma=([1,numDatos(f)].dato(f,))}
MP TemaV Diseodealgoritmositerativoscorrectos
30
MP TemaV Diseodealgoritmositerativoscorrectos
31
4 Diseo
4.
Diseodealgoritmositerativosms
de algoritmos iterativos ms
complejos
Disearelsiguientealgoritmosinutilizarlaoperacin
de potenciacin
depotenciacin.
{n0}
???
{elevar(x,n)=xn }
MP TemaV Diseodealgoritmositerativoscorrectos
32
Aplicaremosunmtodoclculobasadoenlassiguiente
Aplicaremos
un mtodo clculo basado en las siguiente
propiedades.
Mtododeclculodexn decostelogartmicoen<n>:
n
n=0
0 xn =1.0
1 0
n>0 nmod 2=0 xn =[xn/2]2
n>0
n>0 nmod 2 0 xn =x.[x
x [xn/2]2
MP TemaV Diseodealgoritmositerativoscorrectos
33
{I?}
{
MP TemaV Diseodealgoritmositerativoscorrectos
34
potencias=xe }
nVar
resultado
invariante
potencias
2
27
1.0
0
x27=1.0
0 [
[x27]1
x1
13
x27=x [x13]2
x2
x3
x27=x
x3 [x6]4
x4
x3
x27=x3 [x3]8
x8
x11
x27=x
x11 [x1]16
x16
16
x27
x27=x27 [x0]32
x32
32
Clculosrealizados:x27
=1.x1.x2.x8.x16
MP TemaV Diseodealgoritmositerativoscorrectos
35
Paso 1.
1 Esquema iterativo del algoritmo a derivar.
derivar El
invariante del bucle se deduce a partir del mtodo de
clculo a aplicar:
{n0}
???
mientrasQue
Q
???hacer
{Inv:xn =resultado.[xnVar]e potencias= xe }
???
finMQ
???
{elevar(x,n)=xn }
MP TemaV Diseodealgoritmositerativoscorrectos
36
MP TemaV Diseodealgoritmositerativoscorrectos
37
Pasos 3 y 4.
4 Deducimos la condicin del bucle y el
cdigo posterior a l:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
p
{xn =resultado.[xnVar]e potencias= xe }
mientrasQue not (nVar=0)hacer
{Inv:xn =resultado.[x
=resultado [xnVar]e potencias= xe }
???
finMQ
{xn =resultado.[xnVar]e potencias= xe nVar=0}
devuelve resultado;
{elevar(x,n)=x
{elevar(x,n)
xn }
nVar=0 xn =resultado.[xnVar]e =resultado.[x0]e
=resultado.[1]
lt d [ ]e =resultado
lt d
MP TemaV Diseodealgoritmositerativoscorrectos
38
Pasos 5 y 6.
6 Diseamos el cdigo interior del bucle y
proponemos una funcin de cota que permite probar su
terminacin:
{n0}
nVar :=n;resultado:=1.0;e:=1;potencias:=x;
: n;resultado: 1 0;e: 1;potencias: x;
mientrasQue not (nVar=0)hacer {f_cota :nVar }
{xn =resultado.[xnVar]e potencias= xe nVar0 }
si not (nVar mod 2=0)entonces
resultado:=potencias*resultado;
finSi
nVar :=nVar/2;e:=2*e;potencias:=potencias*potencias;
{xn =resultado.[xnVar]e potencias= xe }
finMQ
fi
devuelve resultado;
{elevar(x,n)=xn }
MP TemaV Diseodealgoritmositerativoscorrectos
39
Sehaanotadoelbucleconelpredicadoinvariante queresumeel
mtodo de clculo aplicado
mtododeclculoaplicado.
MP TemaV Diseodealgoritmositerativoscorrectos
40
5 Aplicacin
5.
Aplicacinaldiseodealgoritmositerativos
al diseo de algoritmos iterativos
debsquedaenunatabla
ElementosdefinidosenunprogramaescritoenAda.
DefinicindeltipotpTabla quealmacena<N>datosde
tipotpD
MP TemaV Diseodealgoritmositerativoscorrectos
41
Problema 5.1.
5 1 Derivar un diseo iterativo para el
siguiente algoritmo Ada.
Pre:([1,N].T()=dato)
(
[
] ( )
)
Post:T(buscar(T,dato))=dato
MP TemaV Diseodealgoritmositerativoscorrectos
42
f
function
ti
b
buscar(T:in
(T i tpTabla;dato:out
t T bl d t t tpD)
t D)
return tpIndice is
Pre:([1,N].T()=dato)
Post:T(buscar(T,dato))=dato
begin
???
while ???loop
Invariante
???
end loop;
p;
???
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
43
Paso 1.
1 Proponemos un predicado invariante para el bucle
hasta:tpIndice;
begin
([1,N].T()=dato)
???
while
hil ???loop
??? l
Inv:([1,hasta1].T()dato)
( [ h t
] ( ) d t )
???
end loop;
???
T(buscar(T,dato))=dato
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
44
hasta:tpIndice;
begin
([1,N].T()=dato)
hasta:=1;
([1,hasta1].T()dato)
( [ h t
] ( ) d t )
while ???loop
Inv:([1,hasta1].T()dato)
???
end loop;
???
T(buscar(T,dato))=dato
T(buscar(T dato))=dato
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
45
hasta:tpIndice;
begin
([1,N].T()=dato)
hasta:=1;
while
hil not
t (T(hasta)=dato)
( (h t ) d t ) loop
l
Inv:([1,hasta1].T()dato)
???
end loop;
([1,hasta1].T()dato) T(hasta)=dato
devuelvehasta;
T(buscar(T,dato))=dato
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
46
h t t I di
hasta:tpIndice;
begin
([1,N].T()=dato)
hasta:=1;
while not (T(hasta)=dato)loop
f_cota
f cota =N
=N hasta
Inv:([1,hasta1].T()dato)
([1,hasta1].T()dato) T(hasta)dato
hasta:=hasta+1;
([1,hasta1].T()dato)
end loop;
devuelve hasta;
T(buscar(T,dato))=dato
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
47
function buscar(T:in tpTabla;dato:out tpD)
return tpIndice is
Pre:([1,N].T()=dato)
Post:T(buscar(T,dato))=dato
hasta:tpIndice;
begin
hasta:=1;
while not (T(hasta)=dato)loop
([1,hasta1].T()dato)
([1 hasta1] T()dato)
hasta:=hasta+1;
end loop;
devuelve hasta;
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
48
Problema 5.2.
5 2 Derivar un diseo iterativo para el
siguiente algoritmo Ada.
Pre:cierto
i
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
[
] ( )
)
T(buscar(T,dato))=dato)
(
(
))
)
((
MP TemaV Diseodealgoritmositerativoscorrectos
49
Pre:cierto
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato) T(buscar(T,dato))=dato)
begin
???
while ???loop
Invariante
???
end loop;
???
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
50
hasta:tpIndice;esta:boolean;
b i
begin
cierto
???
while ???loop
Inv:esta=([1,hasta].T()=dato)
esta T(hasta)=dato
???
end loop;
???
([1,N].T()dato) buscar(T,dato)=0)
((
(([1,N].T()=dato)
[ , ] ( )
)
T(buscar(T,dato))=dato)
(
( ,
))
)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
51
hasta:tpIndice;esta:boolean;
b i
begin
cierto
hasta:=1;esta:=T(hasta)=dato;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
while ???loop
Inv:esta=([1,hasta].T()=dato)
Inv:esta=([1 hasta] T()=dato)
esta T(hasta)=dato
???
end loop;
???
(
([1,N].T()dato)
[ , ] ( )
)
buscar(T,dato)=0)
( ,
) )
(([1,N].T()=dato) T(buscar(T,dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
52
hasta:tpIndice;esta:boolean;
begin
g
cierto
hasta:=1;esta:=T(hasta)=dato;
esta
esta=([1,hasta].T()=dato)
([1,hasta].T() dato) esta T(hasta)
T(hasta)=dato
dato
while not (hasta=Nor esta)loop
Inv:esta=([1,hasta].T()=dato) esta T(hasta)=dato
???
end loop;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
(hasta=N esta)
if estathen return hasta;else return 0;end if;
([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
(([1 N] T()=dato) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
53
hasta:tpIndice;esta:boolean;
begin
g
cierto
hasta:=1;esta:=T(hasta)=dato;
while not (hasta
(hasta=Nor
Nor esta)loop
f_cota
f cota =N
N hasta
Inv:esta=([1,hasta].T()=dato) esta T(hasta)=dato
esta=([1,hasta].T()=dato) esta T(hasta)=dato
(hastaN esta)
hasta:=hasta+1;esta:=T(hasta)=dato;
esta=([1,hasta].T()=dato) esta T(hasta)=dato
end loop;
if estathen return hasta;else return 0;end if;
([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
(([1 N] T()=dato) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
54
function buscar(T:in tpTabla;dato:intpD)
return integer is
Pre:cierto
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()
(([1,N].T()=dato)
dato) T(buscar(T,dato))
T(buscar(T,dato))=dato)
dato)
hasta:tpIndice;esta:boolean;
begin
hasta:=1;esta:=T(hasta)=dato;
while not (hasta=Nor esta)loop
esta=([1,hasta].T()=dato) esta T(hasta)=dato
hasta:=hasta+1;esta:=T(hasta)=dato;
end loop;
if estathen return hasta;else return 0;end if;
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
55
Problema5.3.Derivarundiseoiterativodelsiguiente
Problema
5 3 Derivar un diseo iterativo del siguiente
algoritmoAda.
Pre:([1,N1].T()T(+1))
(
[
] ( ) (
))
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato)
[
] ( )
)
T(buscar(T,dato))=dato)
(
(
))
)
((
Utilizaremos:
l
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
esta(T,dato,inf,sup)=([inf,sup].T()=dato)
t (T d t i f
) ( [i f
] T( ) d t )
MP TemaV Diseodealgoritmositerativoscorrectos
56
function buscar(T:in tpTabla;dato:intpD)
return
t
i t
integer
i
is
Pre:ordenada(T,1,N)
Post:(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N) T(buscar(T,dato))=dato)
MP TemaV Diseodealgoritmositerativoscorrectos
57
Pre:([1,N 1].T()T(+1))
Pre:([1,N1].T()T(+1))
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato) T(buscar(T,dato))=dato)
begin
???
while ???loop
Invariante
???
end loop;
???
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
58
izda,dcha:tpIndice;
begin
g
ordenada(T,1,N)
???
while ???loop
Inv:ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
???
(esta(T,dato,1,N)
(esta(T dato 1 N) buscar(T,dato)=0)
buscar(T dato)=0)
(esta(T,dato,1,N) T(buscar(T,dato))=dato)
end buscar;
Donde:ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
esta(T dato inf sup) ( [inf sup] T( ) dato)
esta(T,dato,inf,sup)=([inf,sup].T()=dato)
MP TemaV Diseodealgoritmositerativoscorrectos
59
izda,dcha:tpIndice;
begin
g
ordenada(T,1,N)
izda :=1;dcha :=N;
ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
while ???loop
Inv:ordenada(T,1,N)
Inv:ordenada(T 1 N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
???
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N)
(esta(T dato 1 N) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
60
izda,dcha:tpIndice;
begin
g
ordenada(T,1,N)
izda :=1;dcha :=N;
while not (izda =dcha)
dcha) loop
Inv:ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
???
end loop;
ordenada(T,1,N) esta(T,dato,1,N)=esta(T,dato,izda,dcha)
izda=dcha
if T(izda)=datothen return izda;else return 0;end if;
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N)
(esta(T dato 1 N) T(buscar(T,dato))=dato)
T(buscar(T dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
61
izda,dcha,medio:tpIndice;
begin
ordenada(T,1,N)
( , , )
izda :=1;dcha :=N;
while not (izda =dcha)loop
f_cota =dcha izda
ordenada(T,1,N) esta(T,dato,1,N)
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
esta(T,dato,izda,dcha)
izda<dcha
medio:=(izda +dcha)/2;
if T(medio)<dato
then izda :=medio+1;else dcha :=medio;
end if;
ordenada(T,1,N)
ordenada(T 1 N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
end loop;
if T(izda)=datothen return izda;else return 0;end if;
(esta(T,dato,1,N) buscar(T,dato)=0)
(esta(T,dato,1,N) T(buscar(T,dato))=dato)
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
62
function buscar(T:in tpTabla;dato:intpD)return integer is
Pre:([1,N1].T()T(+1))
Post:(([1,N].T()dato) buscar(T,dato)=0)
(([1,N].T()=dato) T(buscar(T,dato))=dato)
izda,dcha,medio:tpIndice;
begin
izda :=1;dcha :=N;
while not (izda =dcha)loop
ordenada(T,1,N) izdadcha
esta(T,dato,1,N)=esta(T,dato,izda,dcha)
medio:=(izda +dcha)/2;
if T(medio)<dato
then izda :=medio+1;else dcha :=medio;
end if;
end
d loop;
l
if T(izda)=datothen return izda;else return 0;end if;
end buscar;
MP TemaV Diseodealgoritmositerativoscorrectos
63
6 Aplicacin
6.
Aplicacinaldiseodealgoritmosde
al diseo de algoritmos de
ordenacininternadeunatabla
DisearelsiguientealgoritmoAda:
Pre:T=To
Post:([1,N1].T()T(+1))
([1,N].(Nm [1,N].To()=To())
=(Nm [1,N].T()=To()))
Utilizaremos:
Utilizaremos:
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
sonPermutacion(T1,T2,inf,sup)=
([inf,sup].(Nm [inf,sup].T1()=T1())
=(Nm [inf,sup].T2()=T1()))
64
Pre:T=To
Post:sonPermutacion(To,T,1,N)
P t
P
t i (T T 1 N) ordenada(T,1,N)
d
d (T 1 N)
Hemosutilizadolossiguientespredicados:
ordenada(T,inf,sup)=([inf,sup1].T()T(+1))
sonPermutacion(T1 T2 inf sup)=
sonPermutacion(T1,T2,inf,sup)=
([inf,sup].(Nm [inf,sup].T1()=T1())
=(Nm [inf,sup].T2()=T1()))
MP TemaV Diseodealgoritmositerativoscorrectos
65
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
begin
???
while ???loop
Invariante
???
end loop;
???
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
66
Problema6.1.Diseodelalgoritmodeordenacininternapor
Problema
6 1 Diseo del algoritmo de ordenacin interna por
seleccindirecta
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
begin
???
while ???loop
Inv:????
I
????
???
end loop;
???
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
67
procedure ordenar(T:inout tpTabla)is
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
i:integer;
begin
???
while ???loop
Inv:([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
???
end loop;
???
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
68
i:integer;
begin
g
T=To
i:=0;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
while ???loop
Inv:([1,i].([i+1,N].T()T()))
Inv:([1 i] ([i+1 N] T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
end loop;
???
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
69
i:integer;
begin
g
T=To
i:=0;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))
Inv:([1 i] ([i+1 N] T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
end loop;
([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N) i=N1
nula;
nula;
laeliminamosporserinnecesaria
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
70
i:integer;j,iMenor :tpIndice;
begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
???
while ???loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
ordenada(T,1,i) sonPermutacion(To,T,1,N)
???
end
d loop;
l
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
71
i:integer;j,iMenor :tpIndice;
begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1) sonPermutacion(To,T,1,N)
i:=i+1;iMenor:=i;j:=i;
([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
ordenada(T,1,i) sonPermutacion(To,T,1,N)
while ???loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
ordenada(T,1,i)
d
d (T 1 i) sonPermutacion(To,T,1,N)
P
t i (T T 1 N)
???
end loop;
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
72
i:integer;j,iMenor
g
j
:tpIndice;dato:tpD;
p
p
begin
T=To
i:=0;
while not (i=N1)loop
Inv:([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;iMenor:=i;j:=i;
while not (j=N) loop
InvInt:([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
73
i:integer;j,iMenor
g
j
:tpIndice;dato:tpD;
p
p
begin
T=To
i:=0;
while not (i=N1)loop
f_cota =N i
Inv:([1,i].([i+1,N].T()T()))
ordenada(T,1,i+1)
ordenada(T 1 i+1) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;iMenor:=i;j:=i;
while not (j=N)loop
f_cota =N j
([1,i1].([i,N].T()T())) ([i,j].T(iMenor)T())
iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N) j N
j:=j+1;
if T(j)<T(iMenor)then iMenor :=j;end if;
([1,i1].([i,N].T()T()))
(
(
( ) ( )))
(
([i,j].T(iMenor)T())
(
) ( ))
iMenori ordenada(T,1,i) sonPermutacion(To,T,1,N)
end loop;
dato:=T(i);T(i):=T(iMenor);T(iMenor):=dato;
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
74
Problema6.2.Diseodelalgoritmodeordenacininternapor
Problema
6 2 Diseo del algoritmo de ordenacin interna por
intercambiodirecto
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
begin
???
while ???loop
Inv:???
I
???
???
end loop;
???
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
75
procedure ordenar(T:inout tpTabla)is
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
i:tpIndice;
begin
???
while ???loop
Inv:([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
???
end loop;
???
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
76
i:tpIndice;
begin
g
T=To
i:=0;
([1,Ni].([Ni+1,N].T()T()))
([1,N i].([N i+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
while ???loop
Inv:([1,N
Inv:([1 Ni]
i].([N
([Ni+1
i+1,N].T()T()))
N] T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
77
i:tpIndice;
begin
g
T=To
i:=0;
while not (i
(i=N1)
N 1) loop
Inv:([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N) i=N1
nula; laeliminamosporserinnecesaria
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
78
i,j :tpIndice;
begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,Ni].([Ni+1,N].T()T()))
Inv:([1,N i].([N i+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
while ???loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
79
i j t I di
i,j:tpIndice;
begin
T=To
T To
i:=0;
while not (i=N1)loop
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) i N1
i:=i+1;j:=0;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx
T(j 1) (M [1,j+1].T())
[1 j 1] T( ))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
while ???loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))
Inv2:([1,N i+1].([N i+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
???
end loop;
ordenada(T,1,N)
d
d (T 1 N) sonPermutacion(To,T,1,N)
P
t i (T T 1 N)
end ordenar;
80
begin
T=To
T T
i:=0;
while not (i=N1)loop
Inv:([1,Ni].([Ni+1,N].T()T()))
Inv:([1,N i].([N i+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
i:=i+1;j:=0;
while not (j=N i) loop
Inv2:([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
???
end loop;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)
T(j+1)=(Mx
(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) j=Ni
nula; laeliminamosporserinnecesaria
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
d
81
i,j:tpIndice;d:tpD;
j
p
p ;
begin
T=To
i:=0;
while not (i=N1)loop
f_cota =N i
Inv:([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N)
ordenada(T Ni N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N)
i:=i+1;j:=0;
while not (j=N i)loop
f_cota =N j
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N) i Ni
j:=j+1;
i T(j)>T(j+1)then
if
(j) (j )
d:=T(j);T(j):=T(j+1);T(j+1):=d;end
(j)
(j)
(j )
(j )
i
if;
([1,Ni+1].([Ni+2,N].T()T()))
T(j+1)=(Mx [1,j+1].T())
ordenada(T Ni
i,N)
N) sonPermutacion(To,T,1,N)
sonPermutacion(To T 1 N) i N
Ni
i
ordenada(T,N
end loop;
end loop;
ordenada(T,1,N) sonPermutacion(To,T,1,N)
end ordenar;
82
procedure ordenar(T:inout
p
(
tpTabla)is
p
)
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
i,j:tpIndice;d:tpD;
begin
i:=0;
while not (i=N1)loop
([1,Ni].([Ni+1,N].T()T()))
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
i:=i+1;j:=0;
while not (j=N i)loop
([1,Ni+1].([Ni+2,N].T()T()))
(
(
( ) ( )))
T(j+1)=(Mx [1,j+1].T())
ordenada(T,Ni,N) sonPermutacion(To,T,1,N)
j:=j+1;
if T(j)>T(j+1)then d:=T(j);T(j):=T(j+1);T(j+1):=d;end if;
end loop;
end loop;
end ordenar;
83
Problema6.3.Diseodelalgoritmodeordenacininternaporel
Problema
6 3 Diseo del algoritmo de ordenacin interna por el
mtododeordenacinrpida(quicksort)deC.A.R.Hoare
Pre:T=To
Post:ordenada(T,1,N) sonPermutacion(To,T,1,N)
begin
???
end ordenar;
Seplanteaundiseoporinmersin.
MP TemaV Diseodealgoritmositerativoscorrectos
84
procedure ordenar(T:inout tpTabla)is
Pre:T=To
Post:ordenada(T,1,N)
t
d
d ( 1 )
sonPermutacion(To,T,1,N)
t i (
1 )
Pre:T=To izdadcha
Post:ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
begin
???
end
d quicksort;
i k
t
begin
quicksort(T,1,N);
end ordenar;
MP TemaV Diseodealgoritmositerativoscorrectos
85
procedure quicksort (T:inout tpTabla;izda,dcha:in tpIndice)is
Pre:T=To izdadcha
Post:ordenada(T,izda,dcha)
t
d
d ( i d d h )
sonPermutacion(To,T,izda,dcha)
t i (
i d d h )
begin
T
T=To
To izdadcha
if izda<dcha then
???
while ???loop
Inv:???
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
MP TemaV Diseodealgoritmositerativoscorrectos
86
i,d:tpIndice;pivote:tpD;
begin
T=To izdadcha
if izda<dcha then
???
while ???loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1
sonPermutacion(To,T,izda,dcha)
( , ,
,
)
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
MP TemaV Diseodealgoritmositerativoscorrectos
87
i,d:tpIndice;pivote:tpD;
begin
T=To izdadcha
i d d h
if izda<dcha then
T=To izda<dcha
pivote:=T(izda);i:=izda +1;d:=dcha;
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
while ???loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1
sonPermutacion(To,T,izda,dcha)
P
t i (T T i d d h )
???
end loop;
???
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
MP TemaV Diseodealgoritmositerativoscorrectos
88
i,d:tpIndice;pivote:tpD;
begin
T=To izdadcha
i d d h
if izda<dcha then
pivote:=T(izda);i:=izda +1;d:=dcha;
while not (i=d+1)loop
Inv:pivote=T(izda) izda+1 i d dcha i d+1
sonPermutacion(To,T,izda,dcha)
???
end loop;
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T()
( [i d 1 i 1] T( ) pivote)
i t ) ([d+1,dcha].pivote
( [d 1 d h ] i t T())
T( ))
sonPermutacion(To,T,izda,dcha) i=d+1
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d 1);quicksort(T,d+1,dcha);
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
MP TemaV Diseodealgoritmositerativoscorrectos
89
begin
T=To izdadcha
if izda<dcha then
pivote:=T(izda);i:=izda
i t T(i d ) i i d +1;d:=dcha;
1 d d h
while not (i=d+1)loop
f_cota =d i+1
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i
([izda+1,i1].T()
1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha) i d+1
if T(i)pivote
then i:=i+1;
elsif T(d)pivotethen d:=d 1;
else dato:=T(i);T(i):=T(d);T(d):=dato;i:=i+1;d:=d 1;
end if;
pivote=T(izda)
i t T(i d ) izda+1
i d 1 i
i d dcha
d h i d+1
d 1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
end loop;
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
end if;
ordenada(T,izda,dcha) sonPermutacion(To,T,izda,dcha)
end quicksort;
90
procedure quicksort (T:inout tpTabla;izda,dcha:in tpIndice)is
Pre:T=To izdadcha
Post:ordenada(T izda dcha) sonPermutacion(To,T,izda,dcha)
sonPermutacion(To T izda dcha)
Post:ordenada(T,izda,dcha)
i,d:tpIndice;pivote,dato:tpD;
begin
if izda<dcha then
pivote:=T(izda);i:=izda +1;d:=dcha;
while not (i=d+1)loop
(
)
p
pivote=T(izda) izda+1 i d dcha i d+1
([izda+1,i1].T() pivote) ([d+1,dcha].pivote T())
sonPermutacion(To,T,izda,dcha)
if T(i)pivote
then
i:=i+1;
elsif T(d)pivotethen d:=d 1;
else dato:=T(i);T(i):=T(d);T(d):=dato;i:=i+1;d:=d 1;
end if;
end loop;
T(izda):=T(d);T(d):=pivote;
quicksort(T,izda,d 1);quicksort(T,d+1,dcha);
quicksort(T,izda,d1);quicksort(T,d+1,dcha);
end if;
end quicksort;
91