Anda di halaman 1dari 18

6.

Arreglos
En este captulo definimos el tipo arreglo. La mayora de los lenguajes de programacin
(JAVA, C, PACAL, etc.! poseen el tipo arreglo. Como "eremos, los arreglos permiten
implementar, representar y manipular de una manera muy con"eniente al tipo a#stracto de
dato secuencia, en particular permiten implementar de manera sencilla los cam#ios de
"alores $ue pueda tener una "aria#le tipo secuencia.
6.1. Definicin del tipo arreglo
%n conjunto finito de enteros consecuti"os se denomina un segmento. Por ejemplo &', (,
)* es un segmento y lo denotamos por [0..3). En general, dados dos enteros p, $ con p $,
el segmento de los enteros i $ue satisfacen p i + $, lo denotamos por ,p..$!. -ote $ue p .
$ implica $ue el segmento ,p..$! es el conjunto "aco. /am#i0n note $ue el n1mero de
elementos del segmento ,p..$! es $2p. -ote adem3s $ue ,)..(! no es un segmento.
%n arreglo es una funcin parcial de los enteros en cual$uiera de los tipos #3sicos ya "istos
(entero, real, car3cter, #ooleano! o el mismo tipo arreglo, y cuyo dominio es un segmento
,p..$!, para p, $ dados. -ote $ue si p.' entonces el arreglo no es m3s $ue una secuencia.
Por lo $ue usaremos la misma notacin de secuencias para denotar la aplicacin de la
funcin en un elemento del segmento, por ejemplo si # es un arreglo con dominio ,'..4!
entonces # es una secuencia de tres elementos y #,)5 representa la imagen de ) seg1n #, es
decir, el 1ltimo elemento de la secuencia. 6ecimos $ue #,'5 es el primer elemento del
arreglo #, #,(5 es el segundo elemento del arreglo #, etc. %n arreglo con dominio ,p..p!
diremos $ue es un arreglo sin elementos, es "aco.
i # es un arreglo con dominio ,'..)! y rango los n1meros enteros, y cuyos elementos tienen
los "alores #,'5.27, #,(5.28, entonces el "alor del arreglo lo denotamos por # . +27, 289.
6ecimos $ue el tipo arreglo es un tipo estructurado, lo cual significa $ue los "alores del
tipo "ienen definidos por una estructura so#re "alores de otros tipos (en este caso una
funcin de enteros a otro conjunto!.
/radicionalmente los arreglos :an sido "istos como un conjunto de "aria#les inde;adas e
independientes $ue comparten un mismo nom#re< el arreglo # con dominio ,'..4!
corresponde a las "aria#les #,'5, #,(5 y #,)5 ("er figura (!. in em#argo, "er a los arreglos
como funciones nos ayudar3 a manejar la formalidad cuando demostremos correctitud de
programas.
En nuestro pseudolenguaje declararemos un arreglo # de la forma siguiente<
arreglo ,p..$! de +tipo9

donde +tipo9 puede ser cual$uier tipo de nuestro pseudolenguaje, inclusi"e el tipo arreglo
mismo. /anto p como $ representan e;presiones de tipo entero cuyos "alores satisfacen p
$.
((4
Ejemplo de declaraciones de arreglos<
(! "ar #< arreglo ,'..-! de entero= (con - '!
)! "ar f< arreglo ,)..4! de entero=
4! "ar a< arreglo ,(..>! de #ooleano=
En la figura ? "emos la representacin gr3fica de un arreglo, donde cada casilla
corresponde a una localidad de memoria, es decir, #,i5 es una "aria#le.
@igura ?
i # es un arreglo con dominio ,p..$! y p i j $, denotamos por #,i..j! los elementos del
arreglo # correspondientes a los ndices en el segmento ,i..j! y decimos $ue es el segmento
de # entre i y j. -ote $ue, por ejemplo, #,p,p! (la secuencia "aca! es un segmento de #.
El tipo de los elementos de un arreglo puede ser un arreglo<
#< arreglo ,p(..$(! de arreglo ,p)..$)! de +tipo9=
Para a#re"iar la notacin colocamos<
#< arreglo ,p(..$(!,p)..$)! de +tipo9=
6ecimos $ue # es un arreglo de dimensin ) de elementos de tipo +tipo9. -ote tam#i0n $ue
# es un arreglo de dimensin ( de elementos de tipo Aarreglo ,p)..$)! de +tipo9B. C "emos
$ue # ser3 una funcin del producto cartesiano ,p(..$(!,p)..$)! en el conjunto de "alores
de +tipo9. Vemos $ue #,i5, p( i < $(, es un arreglo cuyos elementos son de tipo arreglo
,p)..$)! de +tipo9. C #,i5,j5 ser3 el elemento j del arreglo #,i5
Por ejemplo si # es un arreglo con dominio ,'..)!,(..7! en los enteros, y #.++27, 28, )9,
+8, ', 2499, entonces #,'5,)5 . 28.
Ejemplo de uso de arreglos<
El pro#lema ya "isto Asumar los elementos de una secuencia de enteros de largo -B puede
ser implementado con el tipo arreglo, o#teni0ndose el programa siguiente<
, const -< entero=
const f< arreglo ,'..-! de entero=
"ar ;,i< entero=
((7
) 24
#,)5
>
#,(5 #,'5
#<
& - ' *
; <. '=
i <. '=
& Dn"ariante D< ( ; . ( j< ' j < i < f ,j5 ! ! (' i -!, funcin de cota creciente< i *
do i + - ; <. ; Ef,i5= i <. iE( od
& ; . (j< ' j < - < f ,j5 ! *
5
Veamos un nue"o pro#lema donde utiliFamos arreglos.
Pro#lema< 6ado un arreglo A de enteros con dominio ,',-!, - ', deseamos calcular el
segmento A,p..$! de A cuya suma de sus elementos sea m3;ima entre todos los segmentos
de A.
%na especificacin formal de este pro#lema es<
, const -< entero=
const A< arreglo ,'..-! de entero= &- '*
"ar suma< entero=
& "erdad *
maxsegsum
& suma . (ma; p,$< ' p $ - < ( j< p j + $ < A,j5!! *
5
Para simplificar la notacin, definimos, para ' p $ -<
(p,$!< ( j< p j + $ < A,j5!
%na estrategia para resol"er este pro#lema es la siguiente<
upongamos $ue - > ' y :emos resuelto el mismo pro#lema pero para el segmento de
A,'..-2(!, es decir, conocemos (ma; p,$< ' p $ -2( < (p,$!!, $ue denotaremos por
suma-2(.
Por lo tanto (ma; p,$< ' p $ - < (p,$!! es el m3;imo "alor entre suma-2( y la suma de
cada uno de los segmentos A,j..-!, para ' j -, esta suma es (j,-!. Esto se de#e a $ue<
(ma; p,$< ' p $ - < (p,$!!
. como - 9 ' e;iste un t0rmino $ue separar
ma; ((ma; p,$< ' p $ -2( < (p,$!!, (ma; p< ' p - < (p,-!!
. por definicin
ma; (suma-2(, (ma; p< ' p - < (p,-!! !
-ote $ue suma-2( lo podemos e;presar de igual forma como< ma; (suma-2), (ma; p< ' p
((8
-2( < (p,-2(!!!. Por lo tanto el proceso iterati"o $ue resuel"e nuestro pro#lema original es<
al comienFo de la iteracin i (comenFando desde '! la "aria#le suma contiene el "alor (ma;
p,$< ' p $ i < (p,$!!, este sera nuestro in"ariante. Dnicialmente podemos esta#lecer el
in"ariante con suma <. '= i<. ' (la suma del segmento m3;imo de un arreglo "aco es cero!.
Cuando llegamos al comienFo de la iteracin - :emos resuelto el pro#lema. Por lo $ue otro
in"ariante es ' i -. C i ( -2i! sir"e como funcin de cota. Por lo tanto el es$uema de
nuestro programa sera<
suma <. '=
i <. '=
& Dn"ariante (suma . (ma; p,$< ' p $ i < (p,$!!! ' i - *
do i+- Prog od
6el an3lisis :ec:o anteriormente Prog de#e consistir en asignar a suma el m3;imo entre el
"alor de la "aria#le suma al comienFo de la iteracin y (ma; p< ' p iE( < (p,iE(!!
Ejercicio< Gacer un programa $ue calcule el m3;imo entre el "alor de una "aria#le suma
(inicialiFada en cero! y (ma; p< ' p - < (p,-!!, para - '.
-otemos de nue"o $ue<
(ma; p< ' p iE( < (p,iE(!!
. podemos separar el 1ltimo t0rmino pues i '
ma; ((ma; p< ' p i < (p,iE(!!, (iE(,iE(!!
. por definicin de (p,$!
ma; ((ma; p< ' p i < (p,iE(!!, '!
. por definicin de (p,$! y i '
ma; ((ma; p< ' p i < (p,i!EA,i5!, '!
. por aritm0tica y i ' (E se distri#uye so#re ma;!
ma; ((ma; p< ' p i < (p,i!! E A,i5, '!
As<
(ma; p< ' p iE( < (p,iE(!! . ma; ((ma; p< ' p i < (p,i!! E A,i5, '!
Por lo tanto si al comienFo de la iteracin i tenemos en una "aria#le r la cantidad (ma; p< '
p i < (p,i!! entonces al comienFo de la iteracin iE( podemos tener la misma cantidad
para iE(, si en Prog :acemos la asignacin r := (r + A[i) ma! 0, donde a ma! " representa
en m3;imo entre a y #. Luego, como ya "imos, este "alor de r nos sir"e para calcular el
"alor de suma al comienFo de la iteracin iE(, :aciendo la asignacin suma := suma ma!
r. C podemos agregar r . (ma; p< ' p i < (p,i!! a nuestro in"ariante (aplicando la
tcnica de fortalecimiento del invariante!. @inalmente en Prog de#emos incrementar i en (
para reflejar la siguiente iteracin.
((>
El programa finalmente es<
, const -< entero=
const A< arreglo ,'..-! de entero=
"ar suma< entero=
& - ' *
suma <. '=
i <. '=
& Dn"ariante< (suma . (ma; p,$< ' p $ i < (p,$!!! ' i -
r . (ma; p< 'pi< (p,i!! *
do i+- r <. (r E A,i5! ma; '=
suma <. suma ma; r=
i <. iE(
od
& suma . (ma; p,$< ' p $ - < ( j< p j + $ < A,j5!! *
5
-ote lo simple de la solucin si :acemos un #uen an3lisis. La estrategia de solucin $ue
empleamos se denomina 6i"ide2and2Con$uer (di"ide y con$uistar3s!, y consiste en
e;presar la solucin del pro#lema en t0rminos de la solucin de pro#lemas Am3s pe$ueHosB
del mismo tipo $ue el original. En el ejemplo anterior tenamos<
(ma; p,$< ' p $ - < (p,$!! . ma; ((ma; p,$< ' p $ -2( < (p,$!!,
(ma; p< ' p - < (p,-!! !
I3s adelante seguiremos ejercitando esta estrategia para conseguir soluciones a pro#lemas.
Ver la deri"acin del mismo programa en JaldeKaij (pag.>?2?'!.
Ejercicios<
(! P3ginas >) y ?( del JaldeKaij.
)! Gacer un programa $ue satisfaga la siguiente especificacin<
, const -< entero=
const s< secuencia de enteros=
"ar r< entero=
& - ' *

& r . (Li,j< ' i + j + -< s,i5 ' s,j5 '! *
5
Ejemplo< 6ada una matriF cuadrada de orden - de enteros :acer un programa $ue
determine si la matriF es sim0trica.
((?
La especificacin formal sera<
, const -< entero=
const I< arreglo ,'..-!,'..-! de entero=
"ar simetrica< #ooleano=
& - ' *
es simtrica
& simetrica (i,j< ' i, j < -< I,i5,j5 . I,j5,i5 *
5
El programa sera<
, const -< entero=
const I< arreglo ,'..-!,'..-! de entero=
"ar simetrica< #ooleano=
"ar n, m< entero=
& - ' *
simetrica <. "erdad=
n <. '=
do n - simetrica
m <. n=
do (m -! simetrica
if I,n5,m5 I,m5,n5 simetrica <. falso
,5 I,n5,m5 . I,m5,n5 sMip
if=
m <. mE(
od=
n <. nE(
od
& simetrica (i,j< ' i, j < -< I,i5,j5 . I,j5,i5 *
5
-ote $ue el programa anterior se deduce del in"ariante para el primer ciclo siguiente<
simetrica (i< ' i < n <(j< ' j < -< I,i5,j5 . I,j5,i5!! ' n -
Ejercicio< pro#ar la correctitud del programa anterior.
6.#. $anipulacin de arreglos
En esta seccin presentamos cmo raFonar so#re arreglos en programas $ue puedan
modificarlos.
6ado un arreglo #, es decir, una funcin con dominio un segmento ,p..$!, es posi#le en el
pseudolenguaje modificar el "alor de la "aria#le #,i5, para un i dado, mediante una
((N
asignacin. As, #,i5<.e es una instruccin "3lida del pseudolenguaje, donde i es una
e;presin cuyo "alor de#e estar en el segmento ,p..$!, y e es una e;presin con igual tipo
$ue los elementos del arreglo #. La interpretacin operacional es AreemplaFar el "alor de la
"aria#le #,i5 por el "alor resultante de e"aluar eB.
Veremos $ue esta asignacin se diferencia de la asignacin ordinaria, en el :ec:o de $ue
esta afecta a la funcin # y no slo a la "aria#le #,i5, y si no estamos conscientes de esto
podemos llegar a conclusiones incorrectas. Veamos un ejemplo<
uponga $ue #,'5 . ( y #,(5 . (. Entonces, #,#,(55 . #,(5 . ( y la instruccin #,#,(55 <. '
es e$ui"alente a #,(5 <. ' y despu0s de esta asignacin tendremos #,#,(55 . #,'5 . (. Parece
paradjico $ue :a#iendo asignado ' a #,#,(55 al final contenga (= sin em#argo, "eremos
$ue esto se de#e a $ue estamos afectando el "alor de una funcin completa, y no slo el
"alor de una "aria#le simple. Concluimos entonces $ue se cumple<
& #,'5 . ( #,(5 . ( * # ,#,(55 <. ' & #,#,(55 . ( *
Vemos la diferencia con la asignacin a una "aria#le ;, donde se cumple<
& "erdad * ; <. ' & ; . ' *
Para e;presar el cam#io de "alor de un arreglo (por lo tanto, de una funcin! introducimos
la siguiente notacin<
ea " un arreglo, i una e;presin cuyo "alor est3 en el dominio de ", y e una e;presin del
tipo de los elementos del arreglo. Entonces #(i<e! denotar3 el arreglo (la funcin! $ue es
igual a # sal"o $ue la imagen de i es e<
#(i<e!,j5 .
[ ]

=
j i si j #
j i si e
Por ejemplo, si #.+), 7, >9 con dominio ,'..4! entonces<
2 #('<N!,'5 . N (es decir, la funcin #('<N! aplicada a ' da N!
2 #('<N!,(5 . #,(5 . 7 (es decir, la funcin #('<N! aplicada a ( da 7!
2 #('<N!,)5 . #,)5 . > (es decir, la funcin #('<N! aplicada a ) da >!
2 #((<N! . +), N, >9
2 (((#('<N!!()<O!! . +N, 7, O9
2 (((#('<N!!('<O!! . +O, 7, >9, para simplificar par0ntesis colocaremos #('<N!
('<O!.
er3 necesario sa#er simplificar e;presiones con la nue"a notacin. Por ejemplo, $ueremos
simplificar #(i<8!,j5 . 8, es decir, tratar de encontrar un predicado e$ui"alente pero en
t0rminos de # solamente. Podemos seguir el siguiente raFonamiento< un j dado cumple con
((O
j.i ji. Para j.i tenemos $ue #(i<8!,j5 . 8 se reduce a #(i<8!,i5 . 8 y esto a 8.8= para j i,
se reduce a #,j5.8. As<
#(i<8!,j5 . 8
por tercero e;cluido y neutro de
(i.j ij! #(i<8!,j5 . 8
distri#uti"idad de so#re
(i.j #(i<8!,j5 . 8! (ij #(i<8!,j5 . 8!
por definicin de #(i<8!
(i.j 8.8! (ij #,j5 . 8!
8.8 es "erdad y simplificacin del
(i.j! (ij #,j5 . 8!
distri#uti"idad de respecto a
(i.j ij! (i.j #,j5 . 8!
ley del tercero e;cluido
V (i.j #,j5 . 8!
simplificacin del
i.j #,j5 . 8
Ejercicios< p3gina O) del Pries.
ea # un arreglo de dimensin ) con dominio ,'..)!,(..7! en los enteros, #.++27, 28, )9,
+8, ', 2499. -ote $ue la notacin #(;<A!, donde ; es una e;presin definida en el segmento
,'..)! representa a un arreglo de dimensin ) con dominio ,'..)!,(..7! y cuyos elementos
son los mismos de # sal"o en ; donde su "alor es A, note $ue A de#e ser un arreglo de
enteros con dominio ,(..7!. E;tendemos esta notacin como sigue< #(,;5,y5<A! representa
un arreglo de dimensin ) con dominio ,'..)!,(..7! y cuyos elementos son todos iguales a
los de # sal"o el elemento ,;5,y5 cuyo "alor es A. -ote $ue #(,(5,)5<('!,(5 . #,(5
()<('!.+8,(',249.
A:ora estamos en condiciones de e;plicar la asignacin #,i5 <. e, en t0rminos de la
definicin como funcin de los arreglos. La asignacin #,i5 <. e no es m3s $ue una
a#re"iacin de la siguiente asignacin a la "aria#le #<
# <. #(i<e!
Cuando descri#imos #,i5 <. e como una a#re"iacin de # <. #(i<e!, la definicin como
funcin de # es usada para descri#ir el efecto de la ejecucin de la asignacin, pero no para
indicar cmo se implementa la asignacin. En la ejecucin de la asignacin #,i5<.e "emos
al arreglo como una coleccin de "aria#les independientes< se e"al1a i y e, se selecciona la
"aria#le #,i5 cuyo ndice es el "alor de i, y se asigna el "alor de e a #,i5. -o se crea un
nue"o arreglo completo #(i<e! $ue se asigna a #. Esto lo "emos mejor en la figura N.
()'
) 7
#,)5
>
#,(5 #,'5
) 24
#,)5
>
#,(5 #,'5
i # es el arreglo<
6espu0s de asignar a #,(5 el "alor de 24
El arreglo # ocupar3 las mismas casillas de memoria pero su "alor ser3<
#<
@igura N
Por lo tanto la definicin formal de la asignacin a un elemento de un arreglo # con
dominio ,p..$!, la regla de la asignacin a arreglos, es<
& P * #,i5 <. e &Q* se cumple
si y slo si
, P e est3 #ien definida i est3 #ien definida p i < $ Q(# <. #(i<e!!5
donde Q(# <. #(i<e!! denota a Q reemplaFando las ocurrencias de # por #(i<e!.
A:ora estamos en capacidad de pro#ar $ue se cumple<
& #,'5 . ( #,(5 . ( * # ,#,(55 <. ' & #,#,(55 . ( *
upongamos $ue se cumple #,'5 . ( #,(5 . (, entonces<
#,#,(55 (# <. #(#,(5<'!!
. & sustitucin *
#(#,(5<'!,#(#,(5<'!,(55
. & #,(5 . ( *
#((<'!,#((<'!,(55
. & definicin de #(;<A! y ( . ( *
#((<'!,'5
. & definicin de #(R<A! y (' *
#,'5
. & #,'5 . ( *
(
Ejemplo donde se usa asignacin de "alores a elementos de un arreglo<
Pro#lema< colocar en cero todos los elementos de un arreglo : de largo -'.
La especificacin formal sera<
, const -< entero=
"ar :< arreglo ,'..-! de entero=
todos cero
()(
& (i< ' i <-< :,i5 . '! *
5
SeemplaFando la constante - por una "aria#le entera n nos lle"a a los in"ariantes P' y P(
siguientes<
P'< (i< ' i < n< :,i5 . '!
P(< ' n -
La guardia sera n - y los in"ariantes son esta#lecidos inicialmente con n <. '.
Dn"estigamos a:ora un incremento de ( en n suponiendo $ue se cumple P' P( n -<
(i< ' i < nE(< :,i5 . '!
como ' n, podemos separar la sumatoria
(i< ' i < n< :,i5 . '! :,n5 . '
por definicin de :(;<A!
(i< ' i < n< :,i5 . :(n<'!,i5! :,n5.:(n<'!,n5
compactando la sumatoria
(i< ' i < nE(< :,i5 . :(n<'!,i5!
La 1ltima lnea nos dice $ue si reemplaFamos a : por :(n<'!, es decir, si asignamos ' a :,n5,
se cumple P'(n <. nE(!. -ote $ue P((n <. nE(! se cumple directamente.
Esto nos lle"a a la siguiente solucin de todos cero<
, const -< entero=
"ar :< arreglo ,'..-! de entero=
"ar n< entero=
n <. '=
=do n - :,n5 , n <. ', nE( od
& (i< ' i <-< :,i5 . '! *
5
Ejemplo<
Calcular una ta#la de frecuencias para - lanFamientos de un dado.
La especificacin formal sera<
, const -< entero= R< arreglo ,',-! de entero=
"ar :< arreglo ,(..?! de entero=
& - ' (i< ' i < -< R,i5 > !
tabla de frecuencias
& (i< ( i < ?< :,i5 . (LM< ' M < -< R,M5 . i!! *
5
())
SeemplaFando la constante - por la "aria#le n nos lle"a a los in"ariantes<
P'< (i< ( i < ?< :,i5 . (LM< ' M < n< R,M5 . i!!
P(< ' n -
La guardia sera n - y los in"ariantes son esta#lecidos inicialmente con n <. ' y
esta#leciendo luego la condicin (i< ( i < ?< :,i5 . '!, $ue ya :emos "isto en el ejemplo
anterior inicialiFar un arreglo en cero.
Dn"estigamos a:ora un incremento de ( en n suponiendo $ue se cumple P' P( n -.
Para cual$uier i, ( i >, tenemos<
(LM< ' M < nE(< R,M5 . i!
. como ' n, podemos separar la sumatoria
(LM< ' M < n< R,M5 . i! E L(R,n5.i!
. an3lisis de casos
[ ] [ ]
[ ] [ ]

= + = <
= <
n R i s ( i! M R < n M ' < M (L
n R i s i! M R < n M ' < M (L
i
i
. por P'
[ ] [ ]
[ ] [ ] [ ]

= +

n R i s ( n R :
n R i s i :
i
i
. por definicin de :(;<A!
:(R,n5<:,R,n55E(!,i5
Por lo tanto, : de#e ser reemplaFado por :(R,n5<:,R,n55E(!. C llegamos a la siguiente
solucin de tabla de frecuencias<
, const -< entero= R< arreglo ,'..-! de entero=
"ar :< arreglo ,(..?! de entero=
"ar n< entero=
& - ' (i< ' i < -< :,i5 > !
n <. '=
, "ar m< entero= m <. (= do m ? :,m5 , m <. ', mE( od5
=do n -
:,R,n55 , n <. :,R,n55E(, nE(
od
& (i< ( i < ?< :,i5 . (LM< ' M < -< R,M5 . i!! *
5
En el programa anterior :emos introducido un nue"o constructor $ue llamaremos A#lo$ueB
y $ue corresponde al programa completo<
, "ar m< entero= m <. (= do m ? :,m5 , m <. ', mE( od5
()4
En un #lo$ue, el alcance de las "aria#les $ue se declaran en 0l es el #lo$ue mismo. Por
ejemplo, la "aria#le m no se puede utiliFar fuera del #lo$ue. in em#argo toda "aria#le
declarada en un #lo$ue T puede ser utiliFada en los #lo$ues $ue se definan dentro de T= por
ejemplo, el arreglo : (declarado en el #lo$ue del programa principal! puede ser utiliFado
dentro del #lo$ue donde se declara la "aria#le m.
Podemos tener anidamiento de #lo$ues<
,"ar n<... ,"ar m<... , "ar p<...5 ...5 ...5
El identificador de una "aria#le declarada en un #lo$ue dado T de#e ser distinto de los
identificadores de las "aria#les declaradas en los #lo$ues $ue contienen a T.
Ejercicio<
(! 6emuestre $ue si : es un arreglo de enteros con dominio ,',-!, P es el predicado
A' n - (i< ' i < n< :,i5 . G(i! !B y G(i! es una e;presin en la cual no
aparece :,5, entonces se cumple<
& P n - E. G(n! * :,n5<. E & P(n <. nE(! *
(-ote $ue asignar ceros en un arreglo es un caso particular de esta proposicin
cuando G(i!.'!.
6.3. %ntercam"io de dos elementos de un arreglo
Iuc:os pro#lemas de programacin pueden ser resueltos intercam#iando los elementos de
un arreglo. 6enotaremos por intercam"io(&'() a la accin<< Aintercam#iar los "alores de
:,E5 y :,@5B. Esta interpretacin informal no ayuda muc:o. %na definicin formal la
daremos definiendo el arreglo :(;, y < A, T! de la siguiente forma<
[ ]
[ ]

=
=

=
y i if T
; i if A
y i ; i if i :
i T! A, < y :(;,
Por lo tanto la regla de intercam"io de elementos de un arreglo es la siguiente<
& P * intercam#io(E,@! & Q * se cumple si y slo si
, P E est3 #ien definida @ est3 #ien definida Q(: <. :(E, @ < :,@5, :,E5 !! 5 es una
tautologa.
i E y @ no dependen de :, es f3cil predecir el efecto de intercam#io(E,@! sin :acer una
demostracin formal. 6e lo contrario, es difcil predecir el efecto sin :acer los c3lculos
correspondientes. Por ejemplo, sea :,'5.' y :,(5.(. Por lo tanto intercam#io(:,'5,:,(5! es
lo mismo $ue intercam#io(',(! lo cual resulta en :,'5.( y :,(5.'. En particular, tendremos
:,:,(55.:,'5.(. Por lo $ue<
()7
& :,:,'55.' * intercam#io(:,'5,:,(5! & :,:,(55 . ' * -U E C%IPLE
i E y @ no dependen de : entonces la operacin intercam#io(E,@! puede escri#irse como<
, "ar r< entero= r <. :,E5= :,E5 <. :,@5= :,@5<. r 5
E;iste una regla, llamada la regla de intercam"io simple, $ue es muy 1til cuando
$ueremos pro#ar la correctitud de programas $ue in"olucran intercam#io de elementos de
un arreglo<
i : no aparece en las e;presiones E y @ entonces se cumple<
& (i< iE i@ < :,i5 . G(i! ! :,E5.A :,@5.T *
intercam#io(E,@!
& (i< iE i@ < :,i5 . G(i! ! :,E5.T :,@5.A *
Ejercicios<
(! 6emuestre formalmente $ue se cumple<
& :,'5.' :,(5.( * intercam#io(:,'5,:,(5! & :,:,(55 . ( *
)! 6emuestre formalmente la regla de intercam#io simple.
Por lo tanto esta regla la podemos utiliFar para demostrar la correctitud de programas $ue
realicen intercam#ios.
Ejemplo< (reu#icacin respecto a un elemento pi"ote! 6ado un arreglo : de - enteros
$ueremos reu#icar los elementos del arreglo utiliFando slo intercam#io de elementos
como la 1nica operacin permitida de arreglos (aparte de la operacin de o#ser"acin de
sus elementos!, de forma tal $ue los primeros M elementos del arreglo, :asta un cierto M a
determinar, sean menores o iguales $ue un n1mero entero dado R, y los 1ltimos -2M
elementos del arreglo desde M sean mayores $ue R.
La especificacin formal de este pro#lema es<
, const -, R< entero=
"ar :< arreglo ,'..-! de entero=
"ar M< entero=
& - 9 ' : . G *
redistribuir
& (F< F < (#j< ' j + - < :,j5 . F ! . (#j< ' j + - < G,j5 . F !! ' M -
(i< ' i + M < :,i5 R ! (i< M i + - < :,i5 9 R ! *
5
()8
El predicado (F< F < (#j< ' j + - < :,j5 . F ! . (#j< ' j + - < G,j5 . F !! indica $ue el
"alor final de : es una permutacin de su "alor original (est3n los mismos elementos
originales y en igual cantidad!. Los otros dos predicados esta#lecen la propiedad $ue
cumplir3 : una "eF concluya el programa.
%na forma de atacar el pro#lema es utiliFando la t0cnica de reemplaFo de constante por
"aria#le, por ejemplo - por n en el 1ltimo predicado. in em#argo, esto resulta en un
programa complicado pues no apro"ec:a la simetra del pro#lema $ue indica $ue los
primeros elementos del arreglo son menores o iguales $ue R y los 1ltimos mayores $ue R
(la simetra de pro#lema sugiere $ue a medida $ue "ayamos considerando uno a uno los
elementos originales del arreglo, ir colocando los menores o iguales al comienFo y los
mayores al final del mismo arreglo!.
-ote $ue si para p,$, ' p $ -, tenemos $ue los primeros p elementos de :, el segmento
:,',p!, son menores o iguales $ue R y los 1ltimos -2$ elementos de :, el segmento :,$,-!,
son mayores $ue R, entonces, si p $, podemos decidir f3cilmente donde reu#icar al
elemento :,p5 o al elemento :,$2(5 (los e;tremos del segmento :,p,$!! de forma $ue
aumentemos en ( el n1mero de elementos ya u#icados sea al comienFo o al final del arreglo
dependiendo respecti"amente de si es menor o igual, o mayor $ue R . i :,p5 es menor o
igual $ue R, no :ace falta reu#icar a :,p5 y tendremos $ue los primeros pE( elementos de :
son menores o iguales a R y los 1ltimos -2$ elementos de : son mayores $ue R. i :,p5 es
mayor $ue R entonces podemos intercam#iar los elementos :,$2(5 y :,p5, y as
o#tendremos $ue los primeros p elementos de : son menores o iguales a R y los 1ltimos -2
$E( elementos de : son mayores $ue R. 6e esta forma, continuando este proceso llegamos
a reu#icar todos los elementos de : y el "alor final de p ser3 el M #uscado en nuestro
pro#lema original.
Esto sugiere $ue el in"ariante sea<
(F< F < (#j< ' j + - < :,j5 . F ! . (#j< ' j + - < G,j5 . F !! (i< ' i + p < :,i5 R !
(i< $ i + - < :,i5 9 R ! ' p $ -

-ote $ue reemplaFamos en la postcondicin una misma "aria#le (M! por dos distintas (p y
$!. in em#argo :emos podido dejar igual la primera ocurrencia de M y reemplaFar la
segunda ocurrencia de M por la "aria#le nue"a $, $uedando el in"ariante<
P' P( P) P4
6onde<
P'< (F< F < (#j< ' j + - < :,j5 . F ! . (#j< ' j + - < G,j5 . F !!
P(< (i< ' i + M < :,i5 R !
P)< (i< $ i + - < :,i5 9 R !
P4< ' M $ -
La postcondicin se o#tiene con M . $, por lo $ue la guardia ser3 M $. El in"ariante puede
()>
ser esta#lecido inicialmente con M, $ <. ', -. Como M de#e aumentar o $ disminuir en cada
iteracin, una funcin de cota decreciente sera $2M la cual es no negati"a pues $ es siempre
mayor o igual a M.
-uestro programa tiene el es$uema siguiente<
M, $ <. ', -=
do M $ od
6eterminemos . i M $ entonces M + $, y los elementos del arreglo en el segmento ,M,$!
son todos candidatos a ser reu#icados, los m3s o#"ios a considerar son :,M5 o :,$2(5.
Consideremos :,M5, lo cual nos lle"a al es$uema<
M, $ <. ', -=
do M $
if :,M5 R (
,5 :,M5 9 R )
fi
od
Como ya o#ser"amos, si :,M5 R entonces #asta con incrementar M en ( para $ue se siga
cumpliendo el in"ariante, y si :,M5 9 R entonces #asta con intercam#iar :,p5 con :,$2(5 (al
ser M + $, tenemos M $2(! y disminuir $ en ( para $ue se siga cumpliendo el in"ariante. El
programa final con las anotaciones es el siguiente<
, const -, R< entero=
"ar :< arreglo ,'..-! de entero=
"ar M,$< entero=
& - 9 ' : . G *
M, $ <. ', -=
&Dn"ariante< P' P( P) P4, demo '= funcin de cota decreciente< $2M*
do M $
& P' P( P) P4 M $ *
if :,M5 R M <. ME(
,5 :,M5 9 R intercam#io(M,$2(!= $ <. $2(
fi
& P' P( P) P4 , demo (*
od
& (F< F < (#j< ' j + - < :,j5 . F ! . (#j< ' j + - < G,j5 . F !! ' M -
(i< ' i + M < :,i5 R ! (i< M i + - < :,i5 9 R !, demo )= /erminacin< demo 4*
5
Ejercicios<
(! 6emuestre la correctitud del programa anterior (ayuda< utilice la regla de
()?
intercam#io simple!.
)! %tiliFando intercam#ios como 1nica operacin so#re arreglos, :acer un programa
$ue dado un arreglo de enteros de largo -, reu#i$ue los elementos del arreglo de
forma tal $ue los primeros elementos del arreglo sean menores $ue un pi"ote dado
R, los elementos del medio del arreglo sean iguales a R y los 1ltimos elementos del
arreglo sean mayores $ue R..
4! %tiliFando intercam#ios como 1nica operacin so#re arreglos, :acer un programa
(rotacin de los elementos de un arreglo! $ue cumpla<
, const J, -< entero=
"ar :< arreglo ,',-! de entero=
& - ' : . G *
rotacin
& (i< ' i + - < :,(iEJ! mod -55 . G,i5 !
,
Cuando definimos una funcin o un procedimiento, la manera como declaramos un
par3metro formal tipo arreglo en el pseudolenguaje es como sigue<
proc +nom#re procedimiento9 ( ... = +tipo par3metro9 ; < arreglo de +tipo9= ....!
donde,
2 +nom#re procedimiento9 es el nom#re del procedimiento.
2 +tipo par3metro9 es entrada, salida o entrada2salida. La interpretacin
operacional es e;actamente la misma $ue para "aria#les simples, es decir, si
el par3metro formal es de entrada entonces en una llamada al procedimiento
se copia el "alor del par3metro real en la "aria#le correspondiente al
par3metros formal, por lo tanto en tiempo de ejecucin el par3metro formal
es un arreglo $ue ocupa un lugar de memoria completamente distinto al del
par3metro real.
En una llamada a un procedimiento $ue contenga arreglos como par3metros, los par3metros
reales determinan los lmites inferiores y superiores del los rangos de los par3metros
formales. Por ejemplo, si en la llamada el par3metro real es un arreglo de enteros con
dominio ,7,('! entonces en la ejecucin de la llamada el par3metro formal ser3 un arreglo
de enteros con dominio ,7,('!. Por lo tanto es con"eniente pasar tam#i0n como par3metros
a los lmites inferior y superior de los dominios de cada arreglo $ue se pase como
par3metro.
Por ejemplo, el programa de reu#icacin seg1n un pi"ote "isto antes lo podemos con"ertir
en un procedimiento $ue dado un arreglo y un pi"ote, redistri#uya los elementos del arreglo
seg1n el pi"ote<
& Pre< : . G G es un arreglo con dominio ,-(..-)! ' -( -) *
& Post< (F< F < (#j< -( j + -) < :,j5 . F ! . (#j< -( j + -) < G,j5 . F !!
-( M -) (i< -( i + M < :,i5 R ! (i< M i + -) < :,i5 9 R ! *
()N
proc Pi"ote( entrada R < entero= entrada -(, -)< entero= entrada2salida :< arreglo de entero=
salida M< entero!
,
"ar $< entero=
M, $ <. -(, -)=
do M $
if :,M5 R M <. ME(
,5 :,M5 9 R intercam#io(p,$2(!= $ <. $2(
fi
od
5
Ejercicios<
(! Gacer un procedimiento $ue implemente la operacin de intercam#io de dos
elementos de un arreglo dado.
)! Gacer una funcin $ue reci#a como par3metro una matriF cuadrada y de"uel"a
"erdad si y slo si la matriF es sim0trica.
4! P3gina (>N JaldeKaij
()O
(4'

Anda mungkin juga menyukai