Vous êtes sur la page 1sur 9

4.

Operaciones sobre vectores


1.
2.
3.

Introduccin
Bsqueda
Actualizacin de vectores ordenados y no
ordenados
1. Insercin
2. Modificacin
3. Borrado
4. Mtodos de Ordenacin
1
1.
2.

C d ti
Cuadrticos
Logartmicos

Bibliografa:

Clavel y Biondi.

Weiss.

Wirth.

4. Operaciones sobre vectores


Objetivos:

Identificar los esquemas


q
bsicos de insercin,
modificacin y borrado en estructuras lineales

Reforzar el concepto de programacin modular:


reutilizar operaciones ya definidas

Conocer los esquemas bsicos de ordenacin


interna: mtodos cuadrticos y los principales
esquemas de
d ordenacin
d
i interna
i
de
d complejidad
l jid d
logartmica

Distinguir cundo deben emplearse cada uno de


ellos

Relacionar los esquemas de ordenacin con los


mtodos de diseo de algoritmos ya vistos

1. Introduccin: Recordatorio
Conjunto
C j t
d
de
elementos
l
t
del
d l mismo
i
ti
tipo
conceptualmente
t l
t
relacionados..
relacionados
Los elementos estn indexados
indexados:: Se accede a ellos a travs de un
ndice..
ndice
Definiciones
V: Vector [1..
..M,
M, 1..
..N]
N] de numrico;
numrico;
..P,
P 1..
P,
..Q]
Q] de carcter;
carcter;
M: Vector [1..

Operaciones elementales:
Acceso/Asignacin
V(1)
Y := V(i) + V(iV(i-1);
1)
V(1) := 1;

Lectura

Leer V(i);
()
Leer_f (f, V(i));

Escritura
Escribir V(i+
V(i+1
1), x, Cadena
Cadena;;
Escribir_f (f, V(j));
V(j));

Operaciones no elementales:
Bsqueda
Actualizacin (Insercin, Modificacin y Borrado)
Ordenacin

2. Bsqueda

Hay que distinguir vectores ordenados o no.


2.1. Bsqueda en vectores no
secuencial

ordenados:
ordenados:

Algoritmo
g
Bsqueda_secuencial_1
Bsqueda_secuencial_
q
_
_1 (V,, N,, X,, Posicin,, Existe)) es
V: Vector [1..
..M]
M] de T; {p
{p.. dato}
N: numrico
numrico;; {p
{p.. dato;
dato; posiciones ocupadas}
{p.. dato}
}
X: T; {p
Posicin:: numrico
Posicin
numrico;; {p
{p.. resultado}
Existe:: lgico
Existe
lgico;; {p
{p.. resultado}
Inicio
Posicin := 1;
Existe := falso
falso;;
mientras Posicin <
<= N y Existe = falso hacer
si V(Posicin) = X entonces
existe := Cierto
Cierto;;
sino
Posicin := Posicin + 1;
fin si
fin mientras
mientras;;
Fin

bsqueda

Bsqueda secuencial vers


vers.. 2
Algoritmo Bsqueda_secuencial_
Bsqueda_secuencial_1
1_1(V
(V,, N, X, Posicin, Existe) es
V: Vector [1..
..M]
M] de T; {p
{p.. dato}
N: numrico
numrico;; {p
{p.. dato;
dato; posiciones ocupadas}
X: T; {p
{p.. dato}
Posicin:: numrico
Posicin
numrico;; {p
{p.. resultado}
Existe:: lgico
Existe
lgico;; {p
{p.. resultado}
Inicio
Posicin := 1;
mientras Posicin< N y V(Posicin) <> X hacer Posicin := Posicin +
1;
fin mientras;
mientras;
si V(
V(Posicion
Posicion)) = X entonces
existe := Cierto
Cierto;;
sino
existe := falso
falso;;
fin si;
si;
Fin

2.2. Bsqueda en vectores

ordenados
ordenados:: bsqueda secuencial

Al
Algoritmo
it
B
Bsqueda_secuencial_2
Bsqueda_secuencial_
d
i l 2 (V,
V N,
N X,
X Posicin,
P i i Existe)
E i t ) es
V: Vector [1..
..M]
M] de T; {p
{p.. dato}
N: numrico
numrico;; {p
{p.. dato}
X: T; {p
{p.. dato}
Posicin:: numrico
Posicin
numrico;; {p
{p.. resultado}
Existe:: lgico
Existe
lgico;; {p
{p.. resultado}
Inicio
posicin := 1;
mientras (posicin < N) y (X < V(posicin)) hacer
Posicin := Posicin + 1;
fin si
fin mientras;
mientras;
si V(Posicin
V(Posicin)) = X entonces
existe := cierto
cierto;;
sino
existe := falso
falso;;
fin si;
si;
Fin

2.3. Bsqueda en vectores ordenados: bsqueda binaria o


dicotmica
Algoritmo Bsqueda_binaria_basica
Bsqueda binaria basica (V,
(V N,
N X,
X pos) es
V: Vector [1..
..M]
M] de T; {p
{p.. dato}
N: numrico
numrico;; {p .dato}
X: T; {p
{p.. dato}
Pos:: numrico
Pos
numrico;; {p
{p.. resultado}
Inf,, Sup:
Inf
Sup: numrico
numrico;; {var.
var. internas}
Inicio
Inf := 1;
Sup := N;
Mientras Inf <> Sup hacer
Med := (Inf + Sup) div 2;
si X>V(Med
X>V(Med)) entonces {entre med+1
med+1 y sup}
sup}
Inf := Med + 1;
Sino {Est entre Inf y Med}
Med}
Sup := Med
Med;;
finsi;;
finsi
Fin mientras;
mientras;
si v(
v(inf
inf)) = x entonces
Pos := inf
inf;;
sino
pos := -inf;
inf;
fin si
Fin

2.3. Bsqueda en vectores ordenados: bsqueda binaria o


dicotmica
Algoritmo Bsqueda_binaria
Bsqueda binaria (V,
(V N,
N X,
X pos) es
V: Vector [1..M]
..M] de T; {p
{p.. dato}
N: numrico
numrico;; {p .dato}
X: T; {p
{p.. dato}
Pos:: numrico
Pos
numrico;; {p
{p.. resultado}
Inf,, Sup:
Inf
Sup: numrico
numrico;; {var.
var. internas}
encontrado:: lgico
encontrado
lgico;;
Inicio
Inf := 1; Sup := N;
encontrado := falso
falso;;
Mientras Inf <> Sup AND not encontrado hacer
Med := (Inf + Sup) div 2;
Si X = V(
V(med
med)) entonces
encontrado := cierto
cierto;;
sino
si X>V(Med
X>V(Med)) entonces {Entre Med+1
Med+1 y Sup } Inf := Med + 1;
sino {Est entre Inf y Med
Med}
} Sup := Med
Med;;
finsi;;
finsi
finsi;;
finsi
Fin mientras
mientras;;
Si encontrado
entonces Pos := med
med;; {o inf
inf}
}
sino si v[inf
v[inf]] = x entonces Pos := inf
inf;;
sino pos := -inf
inf;;
fin si
fin si
Fin

3. Actualizacin
Suponemos un vector de M posiciones
Estn ocupadas N de ellas (0 <= N <= M)
No podemos ocupar ms de M
No podemos ocupar menos de 0

El algoritmo
algo itmo error()
e o () nos permite
pe mite terminar
te mina el programa,
p og ama aunque
a nq e no sea
necesario hacerlo
Tras cada operacin de actualizacin (insercin, modificacin o
y que
q
asegurar
g
que
q
estas premisas
p
se sigan
g
cumpliendo.
p
borrado)) hay
3.1.1. Insercin en vectores desordenados
Algoritmo Insertar_1 (V, N, X) es
V: Vector [1..M] de T; {p. datodato-resultado}
N: Numrico; {p. datodato-resultado}
X: T; {p. dato}
Inicio
Si N < M entonces
N := N +1;
V(N) := X;
Sino
Error (No hay espacio disponible);
Finsi
Fin

3.1.2. Eliminacin en vectores desordenados


Algoritmo Eliminar_
Eliminar 1 (V,
Eliminar_1
(V N,
N X) es
V: Vector [1..
..M]
M] de T; {p
{p.. datodato-resultado}
N: Numrico
Numrico;; {p
{p.. datodato-resultado}
X: T; {p
{p.. dato}
I, Pos:
Pos: numrico
numrico;;
Existe:: lgico
Existe
lgico;;
Inicio
Si N > 0 entonces {hay elementos}
Bsqueda_secuencial_1
Bsqueda_secuencial_
1 (V, N, X, Pos, Existe)
Existe);;
Si Existe entonces
{opcin 1, no importa el orden en que se insertaron}

V(pos) := V(N)
V(N);;
N:=N=N-1; }

{opcin 2, si importa el orden en que se insertaron}

Sino

N := N 1;
Para I de Pos a N hacer
V(I) := V(I+
V(I+1
1);
Fin para
Error (El elemento no existe);
existe);

Fin si
Sino
Error (Vector vaco)
vaco);;
Fin si
Fin

3.1.3. Modificacin en vectores desordenados


Algoritmo Modificar_
Modificar_1
1 (V, N, X, Y, ok) es
V: Vector [1..
..M]
M] de T; {p
{p.. datodato-resultado}
{p.. dato}
}
N: Numrico
Numrico;; {p
X, Y : T; {p
{p.. dato}
Pos:: numrico
Pos
numrico;;
ok:: lgico
ok
lgico;;
Inicio
Si N > 0 entonces
Bsqueda secuencial 1 (V,
Bsqueda_secuencial_1
Bsqueda_secuencial_
(V N,
N X,
X Pos,
Pos Existe)
Existe);;
Si Existe entonces
V(Pos) := Y;
Sino
Error (El elemento no existe);
existe);
Fin si
Sino {no hay elementos}
Error (Vector vaco)
vaco);;
Fin si
Fin

3.2.1. Insercin en vectores ordenados


Algoritmo Insertar_
Insertar 2 (V,
Insertar_2
(V N,
N X,
X ok) es
V: Vector [1..M]
..M] de T; {p
{p.. datodato-resultado}
N: Numrico
Numrico;; {p
{p.. datodato-resultado}
X: T; {p
{p.. dato}
ok:: lgico
ok
lgico;; {p
{p.. resultado}
Pos, I: numrico
numrico;;
Inicio
ok := falso
falso;;
Si N < M entonces
Bsqueda_binaria (V, N, X, Pos
Pos));
Si Pos < 0 entonces{se debe insertar en la posicin pos ya que la posicin debe ser
positiva}
positiva
}
pos := -p
p
pos;;
pos
N := N +1;
Para I de N a Pos + 1 paso -1 hacer
V(I) := V(I
V(I--1);
Fin p
para;;
para
V(Pos) := X;
ok := cierto
cierto;;
sino {El elemento ya exista en v(pos)}
Error ((El elemento y
ya exista);
exista));
Fin si;
si;
sino
Error (No hay espacio disponible)
disponible);;
Fin si
Fin

3.2.2. Eliminacin en vectores ordenados


Algoritmo
l
i
Eliminar_2
Eliminar_
li i
2 (V,
( N, X, ok)
k) es
V: Vector [1..
..M]
M] de T; {p
{p.. datodato-resultado}
N: Numrico
Numrico;; {p
{p.. datodato-resultado}
X: T; {p
{p.. dato}
ok:: lgico
ok
lgico;; {p
{p.. resultado}
I, Pos:
Pos: numrico
numrico;;
Inicio
Si N > 0 entonces {hay elementos}
Bsqueda_binaria (V, N, X, Pos)
Pos);;
pos > 0 entonces
Si p
N := N 1;
Para I de Pos a N hacer
V(I) := V(I+
V(I+1
1);
Fin para
Sino
Error (El elemento no existe);
existe);
Fin si
Sino
Error (Vector vaco)
vaco);;
Fin si
Fin

3.2.3.1. Modificacin de vectores ordenados


Algoritmo Modificar_
Modificar_2
2 (V, N, X, Y, ok) es
V: Vector [1..
..M]
M] de T; {p
{p.. dato
dato--resultado}
N: Numrico
Numrico;; {p
{p.. dato}
X, Y: T; {p
{p.. dato}
ok:: lgico
ok
lgico;; {p
{p.. resultado}
Inicio
Eli i
Eliminar_2
Eliminar_
2 (V,
(V N,
N X,
X ok);
ok)
k); {O (n+log
( +l
n)}
)}
si ok entonces {se pudo eliminar}
Insertar 2 (V, N, Y, ok)
Insertar_2
Insertar_
ok);; {O (n+log n)}
fin si
Fin

3.2.3.2. Modificacin en vectores ordenados


Algoritmo Modificar_
Modificar_3
3 (V, N, X, Y, ok) es
V: Vector [1..
..M]
M] de T; {p
{p.. datodato-resultado}
N: Numrico
Numrico;; {p
{p.. dato}
X, Y: T; {p
{p.. dato}
ok:: lgico
ok
lgico;; {p
{p.. resultado}
pos:: numrico
pos
numrico;; {variable interna}
Inicio
ok := cierto
cierto;;
Si N = 0 entonces
ok := falso
falso;;
Escribir Vector Vaco;
Vaco;
Sino
Bsqueda_binaria (V, N, X, Pos)
Pos);; {O(log n)}
Si Pos > 0 entonces
V(Pos) := Y;
{es
{
es necesario reordenar?}
{ordenar (V, N)
N);;?}
Sino
ok := falso
falso;;
Escribir El elemento no existe
existe;;
Fin si
Fin si
Fin

ES NECESARIO REORDENAR?
En este momento sabemos que se cumple:
V(Pos) := Y;
V(i) V(i+1): 1 i < pospos-1
V(i) V(i+1): pos +1 i < N
Qu casos se pueden dar?
a) V(pos
V(pos--1) V(pos) V(pos+1) N = 1
b) V(pos) < V(posV(pos-1) y N > 1
c)) V(pos)
V(
) > V(pos+1)
V(
1) y N > 1
Qu hay que hacer?
a) Nada.
Nada El vector sigue ordenado
ordenado.
b) y c) Es necesario reordenar la mitad afectada.
Se puede preguntar directamente
V(pos) < V(posV(pos-1) V(pos) > V(pos+1)?
Si N> 1 y pos = 1 slo se puede preguntar V(pos) > V(pos+1)?
Si N> 1 y pos = N slo se puede preguntar V(pos) < V(posV(pos-1)?
Si N>1 y pos 1 y pos N entonces deben preguntarse ambos casos.
casos

si N > 1 entonces {no hemos terminado}


si pos = 1 entonces
si V(pos) > V(pos+1) entonces
{Insertar V(pos) en pos+1..N}
fin si
s
sino {pos 1}
si pos = N entonces
si V(pos) < V(pos - 1) entonces
{Insertar V(pos) en 1..pos1..pos-1}
fin si;
sino {pos 1 y pos N}
si V(pos) > V(pos+1) entonces
{Insertar V(pos) en pos+1..N}
sino
si V(pos) < V(pos - 1) entonces
{Insertar V(pos) en 1..pos1..pos-1}
fin si;
finsi
fin si;
fin si; {pos = 1}
fin si
{CADA INSERCIN IMPLICA DESPLAZAMIENTOS: 0(n/2)}

Vous aimerez peut-être aussi