Sei sulla pagina 1di 45

2.

1
CAPÍTULO II: INTRODUCCIÓN A LAS
ESTRUCTURAS DE DATOS

2.1 Conceptos básicos

a) Dato
Representa una abstracción de la realidad, en el sentido de que
ciertas propiedades y características de un objeto real se
seleccionan para estudiar un problema concreto.
Por ejemplo: edad = 20 es un dato.

• Los datos son costosos.


• Deben ser manejados de tal manera que sean correctos y estén
disponibles para producir información.

b) Tipo de dato
Tipificación que caracteriza esencialmente el conjunto de valores
al que pertenece una constante o sobre el que puede tomar valores
una variable o expresión, o cuyos elementos pueden ser generados
por una función.
2. 2

Conjunto de tipos de datos

Lenguaje de provee
programación

Conjunto de operaciones
básicas asociadas a cada tipo
de dato.

Por ejemplo, en Pascal:


Tipo de dato Valores Operaciones
INTEGER 1, -60 +,-,*,/,mod,<,>,read,write

REAL 1.234 +,-,*,/,<,>,sin,cos,read,write


0.456E25

BOOLEAN TRUE AND,OR,NOT


FALSE Uso de expresiones lógicas
(WHILE, IF, etc.)

c) Tipo de dato abstracto TDA (Abstract Data Type ADT)


• Un TDA es un conjunto de objetos y operaciones asociadas a
esos objetos.
• Se conoce la semántica (significado) de las operaciones. No se
conoce su implementación.
• Los algoritmos son diseñados en términos de estas operaciones.
2. 3
Una estructura de
Implementación se define almacenamiento.
del TDA

Procedimientos que llevan


a cabo las operaciones.

Ejemplo: Tipo de dato abstracto CONJUNTO


Colección no ordenada de distintos elementos.

Operaciones típicas relacionadas con conjuntos:


• UNION (A, B, C)
Datos: conjuntos A y B.
Resultado: conjunto C = A∪B, conjunto de elementos que son
miembros de A y B.

• INTERSECCIÓN (A, B, C)
Datos: conjuntos A y B.
Resultado: conjunto C = A∩B, conjunto de elementos que son
miembros de A y B.

• DIFFERENCE (A, B, C)
Datos: conjuntos A y B.
Resultado: conjunto C = A-B, conjunto de elementos en A que no
pertenecen a B.

• MEMBER (x, A)
Datos: conjunto A; elemento x
Regresa: TRUE si X ∈ A y
FALSE si X ∉ A
2. 4
• MAKENULL (A)
Resultado: define A igual al conjunto vacío.

• INSERT (x, A)
Datos: conjunto A, elemento x
Resultado: A A ∪ {x}
Si x ya se encuentra en el conjunto, el procedimiento no modifica el
conjunto original.

Declaración de variables asociadas a un TDA:


Por ejemplo: var A, B, C, D : CONJUNTO;

A nivel general, las componentes de un TDA son:


– INTERFASE
– IMPLEMENTACIÓN

TDA
Operacion-1 IMPLEMENTACIÓN
* Estructuras de Datos
Operacion -2
INTERFASE * Algoritmos de servicio
Operacion -3 * Procedimientos de
Operacion -4 Operaciones
2. 5
Ejemplo: Modelo STACK
Lista lineal en que la inserción y eliminación de un elemento son
realizados por un extremo (lista LIFO).
Operaciones :
PUSH : Ingresar elemento a la lista stack
Lista stack, Elemento
Lista stack ∨ Stack-Full

EMPTY : Determina si la lista está con elementos


Boolean

Los TDA presentan 2 propiedades:


• Generalización : Representan un desarrollo más avanzado con
respecto a los tipos de datos primitivos (enteros, reales, etc.).
Los TDA son generalizaciones de los tipos de datos primitivos.

• Encapsulación : Es posible localizar la definición del tipo y


todas las operaciones asociadas en un solo lugar. Sólo una
formulación y acceso están disponibles a través de
procedimientos definidos.
los tipos de datos
Implementación consiste en su
del TDA representación
en términos de

struct STACK{ los operadores existentes (en


int FIN; el lenguaje de programación)
elementoVALOR [1..MAXS];
};
2. 6
d) Estructura de datos
• Es una colección de variables, posiblemente de distintos tipos,
interrelacionados entre sí, que en su conjunto y con operadores
disponibles permiten organizar y representar a los datos.

• La celda es el elemento básico para construir estructuras.

• Las estructuras de datos se crean dando nombres a agrupaciones


de celdas y, opcionalmente, interpretando los valores asociados
a algunas celdas como conexiones entre celdas (punteros).
Ejemplo: Arreglos, Matrices, Registros, Punteros.

Cada estructura de datos puede tener varias representaciones


físicas diferentes para sus almacenamientos posibles.

Clasificación de las estructuras de datos


Compuestas
Simples Lineales No lineales
Arreglo Stacks Árbol binario
Registros Colas Árbol binario de búsqueda
Listas lineales con Árbol n-ario de búsqueda
nexos B-tree, B*-tree, B+- tree
Trie
Arboles generales
Grafos
2. 7
e) Organización de archivos
• Las técnicas de estructuración de datos aplicadas a conjuntos de
datos, los cuales son manejados como verdaderas “cajas
negras” en los sistemas operativos, son llamadas comúnmente
organización de archivos.
• Un archivo tiene nombre, contenido, dirección donde se guarda
y alguna informción admisnistrativa.
• Estas organizaciones determinan como se estructura el
contenido de los archivos, los cuales son construidos con base
en técnicas de estructuración de datos.

Clasificación de las estructuras de datos y


de la organización de archivos
Estructura Estructura
de datos de datos
Estructura de datos Organización de
Primitivas
simples
compuestas archivos
No lineales
Lineales Binarias N-arias
Enteros Cadena Pila Árbol binario Gráfos Secuencial
Boolea Arreglo Colas Árboles de Árboles Relativo
nos búsqueda generales
Carácter Regis- Listas Binarios Árboles de Secuencial
tro enlaza- búsqueda de Indexado
das M-caminos
Árboles-B
Multillave
Árboles B*,B+
Trie
2. 8
2.2 Formación y selección de estructuras de datos
2.2.1 Recursos básicos

a) Arreglos
• Mecanismo de agregación más sencillo en la mayor parte de los
lenguajes de programación.
• Es a veces, el único medio para crear estructuras de datos.
• Es una sucesión de celdas de un tipo dado. Se define por:
tipo_celda nombre_array[tipo_indice];

Representación de Arreglos
La memoria puede ser manejada como una secuencia de bytes
numerada de 1 a m.
Si el arreglo está declarado como:
A(l1:u1;l2:u2;...;ln:un)
entonces el número de elementos es :
n

∏i = 1
( u i − l i + 1 )

Una manera de representar el arreglo es en orden principal de fila.


2. 9
Por ejemplo, si A(4:5;2:4;1:2;3:4) entonces se debe almacenar
24 elementos, que se almacenarán como :
A(4,2,1,3), A(4,2,1,4), A(4,2,2,3), A(4,2,2,4), A(4,3,1,3),
A(4,3,1,4), ...

i) Arreglo unidimensional

l1 u1
A(l1:u1)
dirección : A(I) = α + I – 1 (α dirección base)
Ejemplo de cálculo de la dirección de un elemento de un arreglo unidimensional
α

0 9 10 11 12 13 14 15

A(5) = 10 + 5 – 1 = 14
u 2 – l2 + 1
ii) Arreglo bidimensional

u 1 – l1 + 1

A(l1:u1;l2:u2)
dirección : A(I,J) = α + (I – 1) (u2 – l2 + 1) + (J – 1)
2. 10
Ejemplo de cálculo de la dirección de un elemento de un arreglo bidimensional
α

1 ,1 1 ,2 1 ,3 2 ,1 2 ,2 2 ,3

A(2,3) = α + 1 • 3 + 2 = α + 3 + 2 = α + 5

iii) Arreglo tridimensional

A(l1:u1;l2:u2;l3:u3)
dirección : A(I,J,K) = α + (I – 1) (u2 – l2 + 1) (u3 – l3 + 1)
+ (J – 1) (u3 – l3 + 1) + (K + 1)

b) Registros
• Mecanismo más general para la obtención de tipos
estructurados.
• Un registro es una celda constituida por un conjunto de celdas
llamadas campos, que pueden ser de tipos distintos.
2. 11
Ejemplos
struct nombre_record{
char * nombre; Nombre NºM at Carrera FNac. Sexo
int nºmat;
int carrera;
double fnac;
int sexo;
};
1 d a ta n e x t
struct nombre_record{
double data;
int next;
} rlist[40]; •

40

c) Punteros
• Mecanismo para representar relaciones entre celdas de una
estructura de datos.
• Un puntero es una celda cuyo valor indica o señala a otra.
n

DATA L IN K

L IN K (n )

En Pascal: En C, sería:
Var ptr : ↑tipo_celda struct tipo_celda *ptr

ptr↑ : denota el valor en Para ver el valor de la


la celda celda: ptr -> data
2. 12
Ejemplo: Implementar una pila en C++.

Diseño de la interfaz:

struct nodo{
int dato;
nodo *siguiente;
}

class cPila {
//Atributos privados
nodo *top;

//Métodos públicos
cPila():top(NULL){}
~cPila(){limpia();}
void limpia();
void poner(int i);
int sacar();
int tamaño();
};
2. 13
Implementación:
void cPila::poner(int i)
{
nodo *p = new nodo;
p->dato = i;
p->siguiente = top;
top = p;
}

int cPila::sacar()
{
if (top != NULL)
{
int d = top->dato;
node *p = top;
top = top->siguiente;
delete p;
return d;
}
else return NULL;
}

void cPila::limpia()
{
nodo *p =top;
while(p)
{
top = top->siguiente;
delete p;
p = top;
}
}
2. 14
d) Cursores
Un cursor es una celda de valor entero, que se usa como puntero a
un arreglo.

Ejemplo: Sea el arreglo


struct celda{
double data;
int next;
}
struct celda reclist[1..4];

y sean las celdas de la cadena de registros del tipo:


struct tipo_reg{
int cursor;
struct tipo_reg *ptr;
};

header 4 2

1 1.2 3
2 3.4 0
3 5.6 2
4 7.8 1
data next
reclist
2. 15
2.2.2 Formación de estructuras de datos
Una estructura de datos es una unidad compuesta de celdas y
procedimientos específicos que mantienen, durante la ejecución de
un programa, datos relevantes para la aplicación.
Esta unidad no sólo tiene por misión guardar datos, sino que también
entregar servicios de actualización, recuperación de información y
mantenimiento de la organización.

El método de organización de una estructura de datos es el medio


utilizado para relacionar las celdas que componen una estructura de
datos.
Entre estos medios, tenemos los ya vistos: arreglos, registros,
cursores y punteros.
Una estructura de datos en particular podrá poseer una mezcla de
estos medios, por ejemplo, usar punteros y arreglos.

La construcción de una estructura de datos nace de la necesidad de


implementar los modelos de datos, ya sea los tipos de datos
abstractos o los objetos.
Los distintos objetos, que las aplicaciones requieren, son derivados
de estas plantillas, las que deben ser representadas con el uso de
estructuras y algoritmos para resolver las problemáticas
computacionales con eficacia y alto rendimiento.
2. 16
Un tipo de datos puede ser aplicados de distintas formas y con
variados recursos computacionales sin que se pierda por este hecho la
concepción y conducta de la abstracción.
Este es un hito significativo e importante dentro de la metodología
propuesta, puesto que confirma la independencia de las definiciones
de alto nivel de la etapa de implementación.

Ejemplo : Matrices poco pobladas


4 0 0 8 0
0 1 0 0 0
A = 0 0 0 0 1
0 3 0 0 0
0 0 2 0 0

Representación 1:
1 1 4
1 4 8
2 2 1
A ’ = 3 5 1
fila c o lu m d a to 4 2 3
5 3 2

Se puede agregar una tupla adicional (en 1er lugar) con la


cantidad de filas, columnas y datos de la matriz: (5,5,6).

Esta representación es útil cuando la información a almacenar


no presenta muchas actualizaciones y mantiene un número
estable.
2. 17
Representación 2 (utilizando listas con nexos)
ABAJO FILA COLUMNA DERECHA
VALOR

i j
a(i,j)

Dependerá de la aplicación, cual representación es la más


conveniente.

En general, para poder configurar convenientemente la organización


de una estructura de datos, se requiere recolectar información tal
como: la conducta de la abstracción, las operaciones más frecuentes,
el porcentaje de utilización, etc. Este estudio debe llevarse siempre
que se quiera responder óptimamente a las exigencias del sistema de
software.
Ninguna estructura es deficiente ni eficaz a priori, sino que estos
atributos deben ser justificados con la consideración de una serie de
parámetros que caracterizan a la aplicación.

Entonces, la construcción o implementación de una estructura de


datos necesita de un riguroso estudio que sea capaz de identificar las
variables de relevancia para la organización y los rangos de
tolerancia de cada uno de ellos. Sólo de esta forma será posible
establecer una óptima estructura de datos.
2. 18
2.2.3 Selección de una estructura de datos
Se caracteriza por:
Paso propio de la fase de implementación.
Paso importante para la metodología de abstracción.
Permite buscar la eficiencia computacional.

Selección de una estructura de datos


TDA
OBJETO → →
ANÁLISIS→
CONSTRUCCIÓN

Distintas Posibilidades

Parte Lógica Parte Física

Características de los distintos tipos de estructuras de datos

Secuenciales : – De fácil uso.


– Rápida en los accesos.
– Lentas en las actualizaciones.

Estructuras
Dinámicas : – Definición y utilización

compleja
– Rápidas en las actualizaciones.
2. 19
Los factores que influyen al seleccionar una estructura:
Las operaciones más frecuentes.
Porcentaje de uso en la organización.
Índice de actualización de los datos.
Recursos del lenguaje elegido.

El problema es:
Encontrar la mejor construcción para abstracciones.
Encontrar la mejor construcción para programa.

Ejemplo:
Almacenar un conjunto de nombres de alumnos y la carrera a la
cual pertenecen.

Alternativa 1: Utilizando un arreglo


nom bre carrera

• Para buscar un nombre, se debe recorrer el arreglo.


• Al insertar un nombre, se debe hacer un espacio.
• Al eliminar un nombre, se debe compactar un espacio.
2. 20
Alternativa 2: Utilizando una lista con nexos
carrera

nombre

• Buscar un nombre, implica recorrer la lista.


• Insertar un nombre implica ingresar un nodo.
• Eliminar un nombre implica eliminar un nodo.

Alternativa 3: Utilizando cursores


nom bre

carrera

• Buscar un nombre, implica recorrer el arreglo correspondiente


• Ingresar un nombre implica hacer un espacio.
• Eliminar un nombre implica compactar el espacio.
• Buscar carrera implica recorrer el arreglo de las carreras.
• Ingresar carrera implica hacer un espacio.
• Eliminar una carrera implica compactar el espacio.
2. 21
2.3 Análisis de algoritmos y orden de magnitud

Un algoritmo es bueno no tan sólo porque cumple con su objetivo, o


porque fue construido usando ciertas técnicas de diseño, sino que
además por usar eficientemente el almacenamiento y procesar los
datos en poco tiempo.

La complejidad de un algoritmo corresponde a :


Requerimientos de espacio.
Requerimientos de tiempo.

Complejidad de tiempo : Exigencia de tiempo necesario para la


ejecución del algoritmo en función del tamaño de los datos.

Complejidad de espacio : Requerimientos de almacenamiento


necesario para datos intermedios durante la ejecución del algoritmo
en función del tamaño de los datos

El tiempo de ejecución depende de los datos de entrada, calidad del


código generado, velocidad de la máquina y la complejidad del
algoritmo.
2. 22
El objetivo del análisis de algoritmos es determinar en forma
cuantitativa las características de los algoritmos diseñados (tiempo
de ejecución y almacenamiento).

El objetivo del análisis de algoritmos es establecer una medida de la


calidad de los algoritmos, que permita compararlos sin la necesidad
de implementarlos.
Esto es, tratar de asociar con cada algoritmo una función matemática
que mida su eficiencia, utilizando para este efecto únicamente las
características estructurales del algoritmo.
Análisis de algoritmos como herramienta para el diseño de
estructura de datos
Estructura de Datos Posibles Algoritmos Medida de Eficiencia

ALGORITMO - 1 f-1

DISEÑO - 1
ALGORITMO - 2 f-i Mejor
algoritmo
... ...

f-N
ALGORITMO - N
¿Mejores estructuras
de datos para
resolver el problema?
ALGORITMO - 1 g-1

DISEÑO - 2 ALGORITMO - 2 g-k Mejor


... ... algoritmo
g-M
ALGORITMO - M
2. 23
Tiempo de ejecución de un programa
Factores a considerar:
Los datos que procesa el programa.
La cantidad de código generado por el compilador utilizado para
crear el programa objeto.
El tipo y velocidad de ejecución de las instrucciones disponibles
en el compilador usado para generar el programa.
La complejidad en el tiempo del algoritmo utilizado en la
construcción del programa.

¿Cómo se comporta el algoritmo en el mejor, peor y promedio de los


casos?

Ejemplo: Invertir una lista encadenada

cab
X1 XN
Antes: ...

Después: cab
XN ... X1
2. 24
Solución 1:
p = cab;
cab = NULL;
while(p != NULL){
q = p->sig;
p->sig = cab;
cab = p;
p = q;
}

Solución 2:
cab ...
X1 X2 X3 XN-2 XN-1 XN
T1

cab ...
XN X2 X3 XN-2 XN-1 X1
T2

cab ...
XN XN-1 X3 XN-2 X2 X1
T3

struct nodo *inv2(struct nodo *cab)


{
int temp;
struct nodo *p, *q, *r;
for (q = cab; q->sig != NULL; q = q->sig);
for(p = cab; p != q && q->sig != p; p = p->sig)
{
temp = p->info;
p->info = q->info;
q->info = temp;
for (r = p; r->sig != q; r = r->sig);
q = r;
}
return cab;
}
2. 25
Algoritmo 1: tiempo de ejecución (tomado cada 200 nodos)

#nodos T(n) segs


20000 0,05
40000 0,05
60000 0,11
80000 0,16
100000 0,22
120000 0,27
140000 0,33
160000 0,38
180000 0,38
200000 0,44
220000 0,55
240000 0,60

Algoritmo 2: tiempo de ejecución (tomado cada 1000 nodos)


# nodos T(n) segs
1000 0,22
2000 1,32
3000 2,91
4000 4,95
5000 7,69
6000 10,93
7000 14,89
8000 19,34
9000 24,45
10000 30,16
2. 26

Lo ideal, al hacer la evaluación de la eficiencia de un algoritmo,


sería encontrar una función matemática que describiera de manera
exacta TA(n).

En el tiempo de cálculo de un algoritmo, se consideran 2 etapas:


1) Estimación a priori: Se trata de obtener una función,
considerando algunos parámetros importantes, que ponga un
límite al tiempo de cálculo de un algoritmo.

2) Estimación a posteriori: Se obtienen estadísticas acerca del


consumo de tiempo y espacio del algoritmo, mientras se ejecuta
en el computador.

1) Estimación a priori
Se desea determinar el tiempo total requerido por la sentencia:
x x+y
al ejecutar el algoritmo, dado un cierto conjunto de datos de entrada.

Para esto se requiere:


Frecuencia de ejecución (número de veces que la sentencia se
ejecuta).
Tiempo requerido por una ejecución.
2. 27
El tiempo de ejecución depende de:
Computador.
Longitud del programa.
Compilador

Por lo tanto, en el análisis a priori, sólo determinaremos la


frecuencia de ejecución de cada sentencia.

Ejemplo: Estimación a priori en base al conjunto de datos:


(a) (b) (c)
... for i = 1 to n do for i = 1 to n do
x=x+1 x=x+1 for j = 1 to n do
... end x=x+1
... end
end

Frecuencia de ejecución de la sentencia x = x + 1;

Frecuencia de ejecución en base sus datos


(a) 1 O(1)
de entrada: “n”.
(b) n O(n)
2 2
Las frecuencias 1, n, n2 se dice que tienen
(c) n O(n )
diferentes órdenes de magnitud
2. 28

En resumen: Un análisis a priori del tiempo de cálculo de un


algoritmo ignora todos aquellos factores que dependen de la
máquina o del lenguaje de programación utilizado.
Se concentra en determinar el orden de magnitud de la frecuencia de
ejecución de las instrucciones.

Orden de magnitud
de una sentencia Frecuencia de ejecución

Orden de magnitud
de un algoritmo Suma de las frecuencias de
todas las instrucciones
contenidas en él

Dados 3 algoritmos que resuelven el mismo problema con órdenes


de magnitud n, n2 y n3 respectivamente.

Se prefiere el primero, pues el segundo y el tercero se hacen


progresivamente más lentos. Por ejemplo, si n=10, se requieren 10,
100 y 1000 unidades
2. 29
Ejemplos de tiempo de cálculo:
constante 0 (1)
logarítmico 0 (logn)
lineal 0 (n)
n log n 0 (nlogn)
cuadrático 0 (n2)
cúbico 0 (n3)
exponencial 0 (2n)

0 (1) < 0 (log n) < 0 (n) < 0 (nlogn) < 0 (n2) < 0 (n3) < 0 (2n)

Notación 0 (0 (g (n)))
• Permite describir los requerimientos de tiempo o espacio al
ejecutar un algoritmo.

• Se dice que f(n), el tiempo de cálculo de un algorimo, es igual a 0


(g (n)) si existen dos constantes c y n0 tal que: |f(n)| ≤ c |g(n)|
∀ n ≥ n0

• f(n) es independiente de la máquina => un análisis a priori, no es


suficiente para determinarlo, pero el análisis a priori puede ser
usado para determinar un g(n) tal que:
f(n) = 0(g(n))

• Se tratará de obtener el menor g(n) tal que f(n) = 0 (g(n)).


2. 30
Regla para sumas:
f1(n) = 0 (n2) f2(n) = 0 (n3) f3(n) = 0(n logn)

Tiempo total: f1(n) + f2(n) + f3(n) = 0 (max (n2, n3, n logn)) = 0 (n3)

Regla de productos:
f1(n) = 0 (n) f2(n) = 0 (n) => f1(n) * f2(n) = 0 (n2)
0 (c * g(n)) = 0 (g(n))
0 (n2/2) = 0 (n2)

Complejidad de un algoritmo
Cantidad de trabajo efectuado por un algoritmo, expresado en una
medida conveniente.

Se aisla una operación particular fundamental en el problema bajo


estudio o en el algoritmo que está siendo evaluado y se utiliza esta
operación como unidad de medida de la complejidad del algoritmo.

El trabajo efectuado por el algoritmo depende de:


i. Tamaño de los datos.
ii. Características particulares que tengan los datos.
• Peor caso.
• Mejor caso.
• Caso promedio.
2. 31
Operación activa
Operación fundamental en el programa, que se utiliza como unidad
de medida, de la complejidad del programa.

Teorema:
Si A(n) = amnm + ... + a1n + a0 es un polinomio de grado m,
entonces: A(n) = 0 (nm).

Ejemplo de operaciones activas


Problema Operación
Encontrar x en una lista de Comparación de x con un
nombres. elemento de la lista.

Multiplicación de dos Multiplicación de dos


matrices con elementos números reales.
reales.

Ordenar una lista de Comparación entre dos


números. elementos de la lista.
2. 32
Ejemplo: Calcular la complejidad de la asignación var=5.
O(1)

Evaluación del tiempo de la asignación var=5 con diferentes


cantidades de datos

TA(n)

Tk

n
10 20 30 40 50
Si TA(n) es O(Tk) TA(n) también es O(1).

Ejemplo:
Calcular la complejidad del programa:
x = 1;
y = 2;
z = 3;

La complejidad de cada asignación es O(1).


Se puede concluir que TA(n) es O(max(1,1,1)), es decir O(1).
2. 33
Ejemplo: Calcular la complejidad del programa x=fact(n)

int fact(int num)


{
int i, acum;
i = 0;
acum = 1;
while (i<num)
{
i++;
acum *= i;
}
return acum;
}

• El segemento: i = 0; acum = 1;
Es O(1).

• Lo mismo que la instrucción return acum;.

• Complejidad del ciclo


while (i < num)
{
i++;
acum *= i;
}
Tanto la comparación como las dos asignaciones son O(1), por lo
que el ciclo es O(1).
2. 34

• Ahora, se busca una función que acote el número de iteraciones


del ciclo. En este caso, podemos escoger f(num)=num, puesto que
éste nunca se va a ejecutar más de num veces.

Esto hace que: Twhile(num) sea O(num*1) = O(num)

• Complejidad de la función: Tfact(num) es O(max(1,num,1)) = O(n)

La complejidad de una función debe quedar en términos de sus


parámetros de entrada, puesto que son los que definen el tamaño
del problema.

El programa x=fact(n) es O(n), porque es el costo de evaluar la


parte derecha de la asignación.

Ejemplo: Algoritmo de ordenamiento de un arreglo A(I), I = 1, n


PROCEDURE BUBBLESORT
# Global A (1, N), N
for i 2 to n do
for j n downto i do
if (A (j-1) > A(j)) then
A(j) A(j-1)
end
end
end
2. 35

if en ciclo interno se ejecuta n – i + 1 veces

i
(n – i + 1)

El número de comparaciones:
n n n n
(n – i + 1) = n– i + 1
i=2 i=2 i=2 i=2

n
n = (n – 2 + 1) n = (n – 1) n
i=2
n
1 = (n – 2 + 1) 1 = (n – 1)
i=2
n n
(n – i + 1) = (n – 1 ) n – i + ( n – 1)
i=2 i=2
n n
2 2
= n – n – i+n–1=n –1– i
i=2 i=2

= n2 – 1 – (n(n + 1)/2 – 1)

= n2 – 1 – n2/2 – n/2 + 1

= n2/2 – n/2 = 1/2 (n2 – n)

∴ 0 (n2)
2. 36
Ejercicios

a) 100 n3 =

b) 6n2 + 3n + 5 =

c) 1 + 2 + 3 + ... + n =

d) 1220 =

e) n + log2n =

f) n =

g) Σ i2 =
1≤i≤n

h) Σ ik =
1≤i≤n
2. 37
i) Búsqueda secuencial
j 1
while (j ≤ n and v(j) ≠ x) do
j j+1
if j > n then
j 0

Datos: x
v (1 : n)

Se pide: Posición de x en el arreglo.

Analizar: Peor caso.

j) Multiplicación de dos matrices.


Cpxr = Apxq * Bqxr

for i 1 to p do
for j 1 to r do
suma 0
for k 1 to q do
suma suma + (Ai,k * Bk,j)
Cij suma
end
end
2. 38
k) Ordenamiento por selección
for i 1 to n – 1 do
k i
x A(i)
for j i + 1 to n do
if aj < x then
k j
x A(j)
end
end
end

Dato: A(i) i = 1, n

Hipótesis
Basta comparar órdenes de magnitud, para comparar métodos.

¡ Falso, cuando hay constantes muy grandes!


2. 39
Ejemplo: Sean tres programas que resuelven un mismo problema
con tiempos:
T1 (n) = n2
T2 (n) = 0,07 n2
T3 (n) = n + 2

n, cantidad de datos en la entrada.

Gráfica de los tiempos para los 3 programas

T1(n)
T3(n)

T2(n)

Siempre existe un valor, a partir del cual αn + k es mejor (más


rápido) que βn2
2. 40
Gráfico de las funciones

2n n2

60

50

40

n logn
30
f
20

n
10
logn
0
0 1 2 3 4 5 6 7 8 9 10

n
Valores de la función
log n n n log n n2 n3 2n
0 1 0 1 1 2
1 2 2 4 8 4
2 4 8 16 64 16
3 8 24 64 512 256
4 16 64 256 4096 65536
5 32 160 1024 32768 4294967296
2. 41

El tamaño del mayor problema que el algoritmo A puede resolver si


la solución va a ser calculada en un tiempo T (considerar 1
microsegundo/paso)

Nº de T=1 min T=1 hora T=1 día T=1 T=1 año


pasos es semana
n 6 * 107 3,6 * 109 8,64 * 1010 6,04 * 1010 3,15 * 1013
n2 7,75 * 103 6,0 * 104 2,94 * 105 2,94 * 105 5,61 * 106
n3 3,91 * 102 1,53 * 103 4,42 * 103 8,45 * 103 3,16 * 104
2n 25 31 36 39 44
10n 7 9 10 11 13
2. 42
Tiempo para distintos valores de n

Tiempo para f(n) instrucciones en un computador 109 instr/sec


n f(n)=n f(n)=log2n f(n)=n2 f(n)=n3 f(n)=n4 f(n)=n10 f(n)=2n
10 .01µs .03µs .1µs 1µs 10µs 10sec 1µs
20 .02µs .09µs .4µs 8µs 160µs 2.84hr 1ms
30 .03µs .15µs .9µs 27µs 810µs 6.83d 1sec
40 .04µs .21µs 1.6µs 64µs 2.56µs 121.36d 18.3min
50 .05µs .28µs 2.5µs 125µs 6.25ms 3.1yr 13d
100 .10µs .66µs 10µs 1ms 100ms 3171yr 4*1013yr
1,000 1.00µs 9.96µs 1ms 1sec 16.67min 3.17*1013yr 32*10283yr
10,000 10.00µs 130.03µs 100ms 16.67min 115.7d 3.17*1023yr
100,000 100.00µs 1.66ms 10sec 11.57d 3171yr 3.17*1033yr
1,000,000 1.00ms 19.92ms 16.67min 31.71yr 3.17*107yr 3.17*1043yr

µs = microsegundo = 10-6 segundos


ms = milisegundo = 10-3 segundos
sec = segundos
min = minutos
hr = horas
d = días
yr = años
2. 43
2.4 Consideraciones para seleccionar una estructura

¿Pequeña ¿Cantidad
Inicio cantidad de
Sí de datos
No
Lista
datos? predecible? ligada

No Sí

¿Velocidad de
Tabla Sí ¿Búsqueda
búsqueda más
Hash e inserción importante que Sí Arreglo
debe ser muy velocidad de ordenado
rápida ? inserción?

No No
Arreglo no
ordenado
¿Clave de
Árbol Sí
distribución
binario de
garantizada
búsqueda
random?

No
Árbol
balanceado
2. 44

Orden de magnitud de las estructuras de datos de propósito general


para las operaciones de búsqueda, eliminación inserción y recorrido

Estructura de Búsqueda Inserción Eliminación Recorrido


datos
Arreglo O(N) O(1) O(N) -
Arreglo O(logN) O(N) O(N) O(N)
ordenado
Lista ligada O(N) O(1) O(N) -
Lista ligada O(N) O(N) O(N) O(N)
ordenada
Árbol binario O(logN) O(logN) O(logN) O(N)
(promedio)
Árbol binario O(N) O(N) O(N) O(N)
(peor caso)
Árbol O(log)N O(logN) Olog(N) O(N)
balanceado
(promedio y
peor caso)
Tabla hash O(1) O(1) O(1) -
2. 45
Orden de magnitud de estructuras de propósito especial para
operaciones de inserción y eliminación

Estructura de datos Insertar Eliminar Comentario


Pila (arreglo o lista O(1) O(1) Borra el item
ligada) insertado más
recientemente
Cola (arreglo o lista O(1) O(1) Borra el item
ligada) insertado menos
recientemente
Cola con prioridad O(N) O(1) Borra el item con
(arreglo ordenado) más alta prioridad
Cola con prioridad O(logN) O(logN) Borra el ítem con
(heap) más alta prioridad

Potrebbero piacerti anche