You are on page 1of 45

Estructura de Datos Antologa 3-A T / M 10 / 01 / 12

Indice
Tipos de datos abstractos (TDA).4 Ejemplo4 Modularidad....5 Un Modulo Puede Ser...5 Objetivos..6 Caractersticas6 Uso de TDA....7 Recursividad.....................8 Ejemplos de casos recursivos..8 Procedimientos Recursivos..9 Estructuras lineales Listas..10 Listas simplemente enlazadas...10 Listas doblemente enlazadas.10 Operaciones bsicas con listas.10 Aplicaciones y Caractersticas...11 Ejemplo..11 Array Dinmico.12 Mtodos de Array Lista...12 Pilas13 Operaciones bsicas con pilas..13 Interface para una Pila de Datos Enteros13 Aplicaciones de Pilas..13 Notacin infija y postfija..14 Colas..15 Tipos de colas..15 Operaciones bsicas con colas15 y 16 Ejemplo..16 Mtodos Colas.....16 y 17 Estructuras no lineales17 Arboles..17 Clasificacin.17 y 18 Contenido.....18 y 19 Ejemplo..19 Grafos20 Formas de Lectura...21 Ejemplo..22 Operaciones Bsicas..23 y 24 Ejercicios..24 y 25 Mtodos de ordenamiento..26 Ejemplo.26 y 27 Quicksort28

Ejemplo.29 y 30 Mtodo de ShellSort...31 y 32 Ejemplo..32 Algoritmo33 Seleccin Sort..34 Ejemplo.35 y 36 Mtodos de Bsqueda37 Bsqueda binaria.38 Ejemplo.38 y 39 Bsqueda por funciones de HASH...40 y 41 Algoritmo HASH...41 Ventajas y desventajas HASH...42 Tipos de Funciones HASH.42 Anlisis de los algoritmos...43 Complejidad en el tiempo..43 y 44 Complejidad en el espacio.44 y 45 Eficiencia de los algoritmos45

Tipos de Datos Abstractos


Un TDA es un tipo de dato definido por el programador que se puede manipular de un modo similar a los tipos de datos definidos por el sistema. Est formado por un conjunto vlido de elementos y un nmero de operaciones primitivas que se pueden realizar sobre ellos.

Ejemplo:
- Definicin del tipo Numero racional: Conjunto de pares de elementos (a,b) de tipo entero, con b<>0.

Operaciones:
CrearRacional: a, b = (a,b) Suma: (a,b) + (c,d) = (a*d+b*c , b*d) Resta: (a,b) - (c,d) = (a*d-b*c , b*d) Producto: (a,b) * (c,d) = (a*c , b*d) Divisin: (a,b) / (c,d) = (a*d , b*c) Numerador: (a,b) = a Denominador: (a,b) = b ValorReal: (a,b) = a/b Potencia: (a,b)^c = (a^c , b^c) Una vez definido se podrn declarar variables de ese tipo y operar con ellas utilizando las operaciones que aporta el tipo. Un TDA es el elemento bsico de la abstraccin de datos. Su desarrollo es independiente del lenguaje de programacin utilizado, aunque este puede aportar mecanismos que faciliten su realizacin. Debe verse como una caja negra. En un TDA existen dos elementos diferenciados: - La Interfaz de utilizacin - La representacin A la hora de utilizar el TDA, la representacin debe permanecer oculta. Solo podremos utilizar las operaciones del tipo para trabajar con sus elementos. Para construir un tipo abstracto debemos: 1. Exponer una definicin del tipo. 2. Definir las operaciones (funciones y procedimientos) que permitan operar con instancias de ese tipo.

MODULARIDAD
Mdulo: Un mdulo que se supone que representa una funcin lgica una secuencia lxicamente contina de instrucciones que se encuentra limitado por elementos de fronteras y adems se caracteriza por disponer de un nombre o identificador Mdulo: Es aqul que est constituido por una o varias instrucciones fsicamente contiguas y lgicamente encadenadas, las cuales se pueden referenciar mediante un nombre y pueden ser llamadas desde diferentes puntos de un programa

Un mdulo puede ser:


Un programa Una funcin Una subrutina La modularidad se basa en la descomposicin de un problema en una serie de sub problemas; dividindolo en mdulos que resultan de segmentar el problema en funciones lgicas que son perfectamente diferenciadas. Esta divisin exige la presencia de un mdulo denominado mdulo de base o principal a objeto de que controle y se relacione con los dems.

Es una tcnica de programacin que todava se utiliza tanto para la construccin de algoritmos computacionales bsicos as como apoyo al desarrollo de sistemas de gestin (en el diseo de diagramas modulares). La salida del mdulo debe ser funcin de la entrada, pero no de ningn estado interno. En la creacin de los mdulos deben cumplirse tres aspectos bsicos: descripcin, rendimiento y diseo. En la descripcin se definen las funciones y objetivos del programa. Para obtener el mximo rendimiento se ha de comprobar que el programa realice el procesos aprovechando al mximo todos los recursos de los que dispone. En cuanto al diseo, se debe comprobar la estructura que sigue el mdulo, as como la estructura de los datos y la forma de comunicaciones entre los diversos y diferentes mdulos. Conforme se extiende el tamao de los algoritmos, se hace ms difcil su revisin, actualizacin y/o correccin. Una poltica comn para solventar este problema consiste en la modularizacin. Esto significa que el algoritmo se fragmenta en partes llamadas mdulos. En realidad, es un mtodo de diseo que tiende a dividir el problema, de forma lgica, en partes perfectamente diferenciadas que pueden ser analizadas, programadas y puestas a punto independiente.

Objetivos:

Descomponer el sistema en mdulos:

- Los grupos deben maximizar el enlace y minimizar el acoplamiento.

Determinar las relaciones entre mdulos:

- Identificar y especificar las dependencias entre mdulos. - Determinar la forma de comunicacin entre mdulos (variables llamadas a funciones, memoria compartida, paso de mensajes)

Especificar las interfaces de los mdulos:

- Facilita la prueba independiente entre los mdulos. - Mejora la comunicacin e integracin del grupo

Caractersticas:

Permite reducir la complejidad global del sistema descentralizado; Mejora la escalabilidad y la productividad (los mdulos pueden desarrollarse independientemente por varias personas)

1. Principios para asegurar diseos modulares:

Soporte de lenguaje para unidades modulares.

Los mdulos deben corresponder a unidades sintcticas del lenguaje utilizado.

Pocas interfaces:

Cada mdulo debe comunicarse con tan pocos como sea posible.

Interfaces pequeas (Acoplamiento dbil):

Si dos mdulos se comunican, deben intercambiar la menor informacin posible..

Interfaces explcitas:

Cuando dos mdulos se comunican, debe estar claro en el texto de uno o de ambos.

Toda la informacin sobre un mdulo debe ser privada al mdulo, a menos que se haya declarado especficamente como pblica.

Usos de TDA
Constructores: Crean una nueva instancia del tipo. Transformacin: Cambian el valor de uno o ms elementos de una instancia del tipo. Observacin: Nos permiten observar el valor de uno o varios elementos de una instancia sin modificarlos. Iteradores: Nos permiten procesar todos los componentes en un TDA de forma secuencial.

Implementacin
Una vez definido el TAD se escoge una representacin interna utilizando los tipos que proporciona el lenguaje y/o otros TAD ya definidos previamente. La representacin deber ocultarse utilizando los mecanismos que nos proporcione el lenguaje. Ocultamiento de Informacin. Normalmente la implementacin del tipo se realiza en un mdulo aparte que ser enlazado al programa principal Se necesitar un fichero cabecera que contenga la definicin de las operaciones y la declaracin del tipo (representacin).

La recursividad
La recursividad es una funcin que se llama a s misma para dividir un problema en problemas ms sencillos, el mtodo recursivo debe estar compuesto de una caso base para el cual ya se conoce un resultado y una llamada al mismo mtodo con una versin ligeramente ms sencilla del problema inicial

Ejemplo:
Factoriales Para todo n entero natural, se llama factorial n (n!) al producto de todos los enteros entre 1 y n:

Cdigo:

Fibonacci: La sucesion de Fibonachi comienza por 0 y 1, y cada numero siguiente es la suma de los dos anteriores: 0,1,1,2,3,5,8,13,21,34,55,89

Procedimientos recursivos
Este mtodo esta compuesto de dos casos bases, y de dos llamadas recursivas al mtodo, a esto se le denomina recursividad mtliple, a diferencia del mtodo factoriales que slo hace una llamada recursiva y se denomina recursividad simple. En ambos casos es de tipo directa, tambin es posible efectuar recursin indirectamente: una mtodo puede llamar a otro quien, a su vez, acabe llamando al primero. A continuacin se expone un ejemplo de programa que utiliza recursin indirecta, y nos dice si un nmero es par o impar. Al igual que el programa anterior, hay otro mtodo mucho ms sencillo de determinar si un nmero es par o impar, basta con determinar el resto de la divisin entre dos. Por ejemplo: si hacemos par(2) devuelve 1 (cierto). Si hacemos impar(4) devuelve 0 (falso). Cdigo:

Cdigo

Hay que apuntar que el factorial puede obtenerse con facilidad sin necesidad de emplear funciones recursivas, es ms, el uso del programa anterior es muy ineficiente, pero es un ejemplo muy claro.

Estructuras lineales
Listas
Es una implementacin de la clase List, que es una coleccin que admite elementos duplicados y nulos, as como acceso por ndice y otros mtodos para trabajar con sus elementos. Tiene varios constructores, dependiendo de cmo necesitemos construir el ArrayList. Los siguientes dos constructores nos ayudarn a empezar: ArrayList() construye un ArrayList con capacidad cero por defecto, pero crecer segn le vayamos aadiendo: ArrayList al = new ArrayList(); ArrayList(int initialCapacity) construye un ArrayList vaco con una capacidad inicial especificada: ArrayList al2 = new ArrayList(5); Un objeto ArrayList slo contiene referencias a objetos. Para almacenar tipos primitivos como doubl, long, o float, usamos una clase envoltura. Para aadir objetos al ArrayList, llamamos a sus mtodos con el operador punto: ArrayList es una de las muchas clases del Collection Framework , que proporciona un conjunto de interfaces y clases bien-diseados para almacenar y manipular grupos de datos como una sola unidad.

Listas Enlazadas Simples y Dobles


1. Simples (con enlace simple) 2. Dobles (doblemente enlazadas) Existe diversas implementaciones de estas estructuras. Las variaciones mas comunes implementan listas circulares y listas con cabecera en sus dos variaciones (simples y dobles)

Operaciones bsicas con listas


1. 2. 3. 4. 5. Recorrido: Procesa c/elemento de la estructura. Bsqueda: Recupera la posicin de un elemento especfico. Insercin: Adiciona un nuevo elemento a la estructura. Borrado: Elimina un elemento de la estructura. Ordenacin: Ordena los elementos de la estructura de acuerdo a los valores que contiene. 6. Mezcla: Combina 2 estructuras en una sola.

10

Aplicaciones y Caractersticas
Un ArrayList es un array dinmico. No tiene capacidad. Su tamao se ajusta de forma dinmica. Constructor por defecto: new ArrayList(). capacidad de un ArrayList creado as es 0. restricciones de

Inicialmente,

la

Los elementos dentro de un ArrayList son Objetos. No pueden ser de tipo bsico, pero pueden ser de cualquier tipo de objeto. La clase ArrayList forma parte del paquete java.util Para poner un elemento dentro de esta estructura, mtodo add y para recoger un elemento usamos el mtodo get. usamos el

Ejemplo:
Primero crearemos la clase persona class Persona{ private String nombres; private String apellidos; public Persona() { //inicializamos variables nombres = ""; apellidos = ""; public void setNombres(String nombres) { this.nombres = nombres; } public void setApellidos(String apellidos) { this.apellidos = apellidos; } public String getNombres() { return this.nombres; } public String getApellidos() { return this.apellidos; } }

11

Array dinmico
Cuando una aplicacin necesita almacenar un grupo de datos en un slo objeto usamos arrays, pero cuando lo que se necesita es incrementar o reducir de forma dinmica el nmero de elementos del array, o hacer que contenga distintos tipos de datos se utilizan los Arraylist Los constructores de un Arraylist son varios, siempre dependiendo de como queramos utilizar el Arraylist, basicmente se utilizan dos: 1. ArrayList() construye un ArrayList con capacidad cero por defecto, pero crecer segnle vayamos aadiendo: ArrayList al = new ArrayList(); 2. ArrayList(int initialCapacity) construye un ArrayList vaco con una capacidad inicial especificada: ArrayList al2 = new ArrayList(5);

Mtodos de ArrayList
int size() -- El tamao actual (puede ser 0) void add(obj) -- Aade un objeto al final del ArrayList, incrementando su tamao de obj es un objeto. Object get(N) -- Devuelve el elemento almacenado a la posicin N en el ArrayList. N tiene que ser un entero entre 0 y size()-1. En ArrrayListInteger.java, se convierte el objeto devuelto por get() a un Integer con casting. En ArrayListString.java, se convierte el objeto devuelto por get() a un String llamando al mtodo toString() de Object.

12

PILAS
Una Pila en palabras sencillas es un lugar donde se almacenan datos,) Una pila (stack o pushdown en ingls) es una lista de elementos de la cual slo se puede extraer el ltimo elemento insertado. La posicin en donde se encuentra dicho elemento se denomina tope de la pila. Tambin se conoce a las pilas como listas LIFO (LAST IN - FIRST OUT: el ltimo que entra es el primero que sale).

Operaciones bsicas con las pilas


-PUSH (insertar).- Agrega un elementos a la pila en el extremo llamado tope. -POP (remover).- Remueve el elemento de la pila que se encuentra en el extremo llamado tope. -VACIA.- Indica si la pila contiene o no contiene elementos. -LLENA.- Indica si es posible o no agregar nuevos elementos a la pila.

Interface para una pila de datos enteros


interface IPila { public boolean llena(); public boolean vacia(); public void push (int elem); public int pop(); }

Aplicaciones de Pilas EXPRESIONES ARITMETICAS: Una expresin aritmtica contiene constantes, variables y operaciones con distintos niveles de precedencia. OPERACIONES : ^ potencia */ multiplicacin, divisin +,- suma, resta

13

NOTACIONES

NOTACION INFIJA: Los operadores aparecen en medio de los operandos. A + B, A 1, E/F, A * C , A ^ B , A + B + C, A+B-C

NOTACION PREFIJA: El operador aparece antes de los operandos. + AB, - A1, /EF, *AC, ^AB, +AB+C, +AB-C

NOTACION POSTFIJA: El operador aparece al final de los operandos. AB+, A1-, EF/, AC*, AB^, AB+C+, AB+C-

14

Colas
Una cola es simplemente un lugar para almacenar cosas, donde esas cosas se insertan una detrs de otra y para extraer siempre se lo hace por adelante de la cola donde se encuentra el primer elemento. Una cola funciona como una fila o cola de personas, que esperan su turno para ser atendidas, la primera persona atendida es siempre la primera de la fila y cuando llega una persona y queremos incorporarla a cola o adicionarla debemos hacerlo por detrs de la ultima persona en la cola. Una cola puede almacenar lo que nosotros queramos, nmeros, personas, documentos, cualquier cosa. Esta estructura de datos tiene muchas aplicaciones en la informtica al igual que la pila, por ejemplo cuando mandan a imprimir varios documentos a una impresora, existe una cola de impresin que sigue la filosofa, se imprimen los primeros documentos y si quiero imprimir un nuevo documento se adiciona al final de todos los documentos que estn esperando a imprimirse.

TIPOS DE COLAS
Cola simple: Estructura lineal donde los elementos salen en el mismo orden en que llegan. Cola circular: Representacin lgica de una cola simple en un arreglo. Cola de Prioridades: Estructura lineal en la cual los elementos se insertan en cualquier posicin de la cola y se remueven solamente por el frente. Cola Doble (Bicola): Estructura lineal en la que los elementos se pueden aadir o quitar por cualquier extremo de la cola (cola bidireccional).

Operaciones bsicas en Colas Simples


Insertar.- Almacena al final de la cola el elemento que se recibe como paramtro. Eliminar.- Saca de la cola el elemento que se encuentra al frente.

15

Vaca.- Regresa un valor booleano indicando si la cola tiene o no elementos (true si la cola esta vacia, false si la cola tiene al menos un elemento). Llena.- Regresa un valor booleano indicando si la cola tiene espacio disponible para insertar nuevos elementos ( true si esta llena y false si existen espacios disponibles).

Ejemplo:
Consideremos que nuestro array bidimensional o vector lo creamos con 10 posiciones enumeradas del 0 al 9, la variable inicio guarda una posicin antes en la cual se encuentra el primer elemento y la variable fin guarda la posicin en donde se encuentra justamente el ultimo elemento.

Entonces los atributos que tendr nuestra clase Cola de nmeros enteros sern:

Mtodos de colas
Ahora una vez teniendo esta estructura hay que definir los mtodos principales para manejar una cola, estos mtodos son: esVacia() : boolean retorna verdad si la cola esta vaca es decir no tiene ningn elemento, para esto solo se pregunta si inicio es igual a fin. esLlena() : boolean retorna verdad si es que la cola esta llena, pasa cuando se ha llenado todo el vector, la cantidad de elemento que permite la cola lo determina la variable MAXIMO. adicionar(int a): adiciona un nuevo elemento a la cola, para esto solo se incrementa la variable fin y se coloca el elemento en esa posicin.
eliminar() : int extrae el primer elemento de la cola, para esto se retorna la posicin inicio + 1 del vector y se incrementa inicio en 1.

16

tamanio() : int retorna la cantidad de elementos que tiene la cola, para realizar esto se realiza la resta fin - inicio.

copiar(Cola B) : copia tal cual la cola B a la cola destino, al finalizar cola B queda totalmente vaca. Este mtodo es muy til al momento de hacer operaciones con colas.

Estructuras no lineales
RBOLES
Estructura no lineal que representa sus nodos en forma de Ramificaciones (Tiende en formar ramas) Clasificacin Segn nmero de hijos Estos pueden ser Binarios, Terciarios, Cuaternarios, n-ario (Mximo n hijos por nodo) Segn estructura de niveles rbol Completo: Es un rbol binario en el cual cada nodo es una hoja o posee exactamente 2 hijos rbol lleno: Es un rbol binario con hojas en a lo ms dos niveles adyacentes y en las cuales los nodos los nodos terminales se encuentran ubicados en las posiciones de ms a la izquierda del rbol.

17

Segn su funcionalidad rbol binario de Bsqueda: es un rbol binario ordenado, las ramas de cada nodo estn ordenadas de acuerdo con las siguientes. rbol binario de expresin: es una estructura que representa una operacin aritmtica conteniendo dentro de su campo informado un operando (numrico) o bines sus operadores asociados Segn su lugar fsico donde se residen los datos. Ordenamiento interno: ocurre sobre estructuras de datos residentes en memoria principal Ordenamiento externo: es aquel que ocurre sobre estructuras de datos residentes en memoria secundaria Segn movimientos de claves de ordenamiento Estable: es aquel que una vez efectuado mantiene el orden relativo de dos o ms registros cuyo criterio de ordenamiento es el mismo No estable: es aquel que una vez efectuado pierde el orden relativo de dos o ms registros cuyo criterio de ordenamiento es el mismo

Contenido
Tiene un nodo raz ya que es el primero y no tiene un anterior El nodo hoja: es aquel que no tiene sucesores (no tiene hijos) Nodo interno: es el que tiene un antecesor y sucesores (hijos) Altura: es la cantidad de nodos para llegar al hijo ms lejano (Se cuenta los nodos desde la raz) Nivel es: el nmero de generaciones que tiene el rbol (Nivel = altura -1) Grado: es la cantidad mxima de hijos

18

Peso: es la cantidad de nodos hojas Nodos completos: Son los que tienen todos sus hijos o ninguno (para que sea completo tiene que tener dos hijos o ninguno) rbol Completo: es el que tiene todos sus nodos completos (sin que ningn nodo solo tenga un hijo)

Raz: 1 Nodo Hojas: 14, 18, 21, 20, 6, 15, 19, 9 Nodo Interno: 2, 3, 4, 5, 17, 16, 7, 8, 10, 13, 12, 11 Altura: 8 Nivel: 7 Grado: 3 Peso: 8 Nodos completos: 1, 3, 4, 14, 16, 21, 20, 6, 9, 10, 14, 15

19

Grafos

Representacin

Por diagrama en columna:

20

Formas de lectura
Hay tres formas: en entreorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el rbol como se puede ver a continuacin: Entreorden IZQUIERDA RAZ DERECHA Preorden Raz izquierda derecha Postorden Izquierda derecha Raz

21

Ejemplo

22

Operaciones bsicas
Bsqueda Si el rbol no es de bsqueda, es necesario emplear uno de los recorridos anteriores sobre el rbol para localizarlo. El resultado es idntico al de una bsqueda secuencial. Aprovechando las propiedades del rbol de bsqueda se puede acelerar la localizacin. Simplemente hay que descender a lo largo del rbol a izquierda o derecha dependiendo del elemento que se busca. Insercin La insercin tampoco es complicada. Es ms, resulta prcticamente idntica a la bsqueda. Cuando se llega a un rbol vaco se crea el nodo en el puntero que se pasa como parmetro por referencia, de esta manera los nuevos enlaces mantienen la coherencia. Si el elemento a insertar ya existe entonces no se hace nada. Borrado La operacin de borrado si resulta ser algo ms complicada. Se recuerda que el rbol debe seguir siendo de bsqueda tras el borrado. Pueden darse tres casos, una vez encontrado el nodo a borrar: 1) El nodo no tiene descendientes. Simplemente se borra. 2) El nodo tiene al menos un descendiente por una sola rama. Se borra dicho nodo, y su primer descendiente se asigna como hijo del padre del nodo borrado. Ejemplo: en el rbol de la figura 5 se borra el nodo cuya clave es -1.

23

3) El nodo tiene al menos un descendiente por cada rama. Al borrar dicho nodo es necesario mantener la coherencia de los enlaces, adems de seguir manteniendo la estructura como un rbol binario de bsqueda. La solucin consiste en sustituir la informacin del nodo que se borra por el de una de las hojas, y borrar a continuacin dicha hoja. Puede ser cualquier hoja? No, debe ser la que contenga una de estas dos claves: 1. la mayor de las claves menores al nodo que se borra.
2. la menor de las claves mayores al nodo que se borra

EJERCICIOS
Recorrido en pre-orden El orden: nodo raz, nodo izquierda, nodo derecha.

Recorrido en post-orden En este caso se trata primero el subrbol izquierdo, despus el derecho y por ltimo el nodo actual.

24

Recorrido en entre-orden En este caso se trata primero el subrbol izquierdo, despus el nodo actual y por ltimo el subrbol derecho.

25

Mtodos de ordenamiento
Es uno de los mtodos ms extendidos y ms fciles, pero a la vez es uno de los menos eficaces. Este mtodo se basa en la ordenacin por cambio de elementos, ya que se van comparando de dos en dos los elementos de la tabla. Si nosotros deseamos ordenar dicha tabla de menor a mayor (ascendente) al realizar la comparacin entre dos elementos se produce el intercambio en el momento en el que el primer elemento es mayor que el segundo. De esta forma el elemento ms grande pasa a estar en el ltimo lugar de la tabla. El elemento sube por la tabla, al igual que una burbuja en un recipiente, de ah proviene su nombre. Los pasos a seguir utilizando este mtodo son los siguientes, imaginando que deseamos realizar una ordenacin creciente: 1.- Se compara el primer elemento con el segundo. Si estn desordenados se intercambian. Luego se mira el segundo con el tercero, intercambiando tambin si es necesario. As hasta que llegamos al ltimo elemento. De esta forma tenemos en la ltima posicin de nuestra tabla el elemento ms grande. 2.- Repetimos lo mismo que antes pero ahora con todos los elemento, menos el ltimo, que ya est ordenado. 3.- Repetimos el primer paso pero esta vez con otro elemento menos, ya que este tambin est ordenado. Este mtodo finaliza en el momento en el que se han realizado tantas pasadas como objetos - 1 hay en la lista. Como es lgico si pensamos que los dems ya estn ordenados, ya est ordenado el arreglo. EJEMPLO Este ejemplo es cuando N=4.

1 3

4
2

2
3

3
4

1
1

2 4

2
2 3

4 5 1

3 4

26

5 7

2 2 3

3 1

1 3 0

4 4 5

6 8

2 1

1 2

3 3

4 5 4 5

Explicacin del ejemplo anterior. 1.- En la primera pasada se cambia el 45 por el 23. 2.- en la segunda pasada se cambia el 45 por el 30. 3.- en la tercera pasada se cambia el 45vpor el 16. 4.- en la cuarta pasada no hay cambios porque es donde vuelve a iniciar el arreglo pero ahora en la posicin siguiente. 5.- en la quinta pasada se cambia el 30 por el 16. 6.- en la sexta pasada no hay cambios porque ya esta acomodado. 7.- en la sptima pasada se cambia el 23 por el 16. 8.- esta es la octava pasada ya q el arreglo esta acomodado y se imprime.

27

QUICK SORT
Este mtodo se basa en la tctica "divide y vencers, que consiste en ir subdividiendo el array en arrays ms pequeos, y ordenar stos. Para hacer esta divisin, se toma un valor del array como pivote, y se mueven todos los elementos menores que este pivote a su izquierda, y los mayores a su derecha. A continuacin se aplica el mismo mtodo a cada una de las dos partes en las que queda dividido el array. Normalmente se toma como pivote el primer elemento de array, y se realizan dos bsquedas: una de izquierda a derecha, buscando un elemento mayor que el pivote, y otra de derecha a izquierda, buscando un elemento menor que el pivote. Cuando se han encontrado los dos, se intercambian, y se sigue realizando la bsqueda hasta que las dos bsquedas se encuentran. AHORA AQU TENEMOS UN ARREGLO DE 9 POSICIONES 45 [0] 1 78 2 3 22 4 4 5 6 3 7 8 95 9 33 22 7 10

Ahora partiremos este arreglo por la mitad que tomaremos como posicin pivote: (Pasaremos los nmeros mayores a la derecha del arreglo y los menores a la izquierda).

28

EJEMPLO
La posicin 4 VALOR 27 ser nuestro pivote y se partir por el centro de cada sub arreglo, ahora todos los menores que

45 [0] 1

78 2

22 3 4

4 5 6

27 7 8

95 9

33

19

10

Mayores que 27 Menores que 27 48 22 4 19 7 10 78 95 33

Solo tenemos mayores 4 7 10 22

10

48 Se vuelve a partir

78

33

48

33

43

29

Despus de que ya no tengamos de dividir, tomamos los mtodos bsicos de ordenamiento, burbuja o seleccin. Hasta quedar ordenado

4 3

8 4

4 7

7 10 22 22 27 45 78 95

AHORA INTENTA REALIZAR ALGUNOS EJERCISIOS POR CUANTA PROPIA:

90

80

102

189

45

47

14

30

50

48

99

102

50

47

89

22

88

100

30

MTODO DE SHELL
Ordena subgrupos de elementos separados K unidades (respecto de su posicin en el arreglo) del arreglo original. El valor K es llamado incremento. Despus de que los primeros K subgrupos han sido ordenados (generalmente utilizando INSERCION DIRECTA), se escoge un nuevo valor de K ms pequeo, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor ms pequeo de K. Eventualmente el valor de K llega a ser 1, de tal manera que el subgrupo consiste de todo el arreglo ya casi ordenado. Al principio del proceso se escoge la secuencia de decrecimiento de incrementos; el ltimo valor debe ser 1. "Es como hacer un ordenamiento de burbuja pero comparando e intercambiando elementos." Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica insercin directa. El mtodo se basa en tomar como salto N/2 (siendo N el nmero de elementos) y luego se va reduciendo a la mitad en cada repeticin hasta que el salto o distancia vale 1. Procedimiento Shell Sort: const MAXINC = _____; incrementos = array[1..MAXINC] of integer; var j,p,num,incre,k:integer; begin forincre := 1 to MAXINC do begin /* para cada uno de los incrementos */ k := inc[incre]; /* k recibe un tipo de incremento */ for p := k+1 to MAXREG do begin /* insercin directa para el grupo que se encuentra cada K posiciones */ num := reg[p];

31

j := p-k; while (j>0) AND (num<reg[j]) begin reg[j+k] := reg[j]; j := j - k; end; reg[j+k] := num; end end end; Ejemplo: Ordenaremos la siguiente lista de nmeros: 4, 2, 7, 8, 9, 1, 3, 4.

Resuelve los siguientes ejercicios mediante el mtodo de ordenamiento Shell Sort:

1.- 4,1,78,23,5,7,24,64,23,100,22,0,15. 2.- 9,5,3,2,1,17,18,16,12,14,0,100,26,38,6. 3.- 12,11,10,9,8,7,6,5,4,3,2,1,0. 4.-3,6,9,12,15,16,14,12,10,8,6,4,2.

32

Algoritmos de ordenamiento Externos


Este es el algoritmo del mtodo BUBBLE SORT.

INICIO p=o px=1 si p=n-1

n
Avanzar 1 a p p>px FIN si Cambiar px a p Avanzar 1 en px

33

SELECTION SORT
Es la bsqueda del menor de los elementos y los va intercambiando hasta terminar el arreglo. (Cambiando de posicin en el arreglo de modo que se va comparando).

ALGORITMO: Paso 1: Para cada posicin del arreglo Paso 2: Inicializa la posicin del arreglo Paso 3: Recorre todo el arreglo Paso 4: Si a [j] es menor Paso 5: Reasigna el apuntador al menor Paso 6: Intercambia los datos de la posicin mnima y posicin 1 Paso 7: Fin

Nota: Estos pasos los podemos reducir para obtener un mayor entendimiento de nuestro algoritmo en: 1. 2. 3. 4. 5. Declara Inicializa Recorre Reasigna Intercambia

34

Ejemplo:
Tenemos el 5 2 0 1 3 10 4 siguiente arreglo con los datos:

1. Se empieza tomando en cuenta los dos primeros nmeros; de estos dos, se busca encontrar el menor elemento. En este caso el menor elemento es el 2, realizamos el intercambio. De manera que nuestro arreglo queda de la siguiente manera: 2 5 0 1 3 10 4

2. Luego se procede a buscar el siguiente elemento menor y se encuentra el cero. Este se intercambia con el dato que est en la primera posicin, quedando el arreglo as despus de dos recorridos: 0 5 2 1 3 10 4

3. El siguiente elemento, el tercero en orden de menor mayor es 1, el cual se intercambia con lo que est en la segunda posicin, que es el 5. y nuestro arreglo queda de la siguiente manera: 0 1 2 5 3 10 4

4. Despus el elemento menor que sigue en nuestro arreglo es el 2, el cual se intercambia con la posicin 3. Pero como ya est en orden, el arreglo se deja igual al anterior:

35

0 1 2 5 3 10 4

5. Continuamos con el siguiente nmero menor despus de los que ya han sido acomodados, ahora el nmero menor seria el 3, el cual es intercambiado por la posicin 4. El arreglo es: 0 1 2 3 5 10 4

6. El siguiente paso es continuar buscando el nmero menor, en este caso sera el 4 y lo cambiamos el nmero 5 que se encuentra en la posicin 5. Intercambiamos y nuestro arreglo sera: 0 1 2 3 4 10 5

7. Para finalizar, buscamos el otro nmero menor que sera el 5 y lo intercambiamos por la posicin 6. Por lo tanto nuestro arreglo ya est terminado y ya hemos acomodado nuestro arreglo. 0 1 2 3 4 5 10

Nota: De esta manera se va buscando el elemento que debe ir en la siguiente posicin hasta ordenar todo el arreglo.

36

Mtodos de bsqueda
Bsqueda Secuencial
Consiste en recorrer y examinar cada uno de los elementos del array o de un archivo hasta encontrar el o los elementos buscados, o hasta que se han mirado todos los elementos del array o del archivo.

Ejemplo
Podra realizarse con un for o con while es como ms te guste y segn tus necesidades Ejemplos cuando solo se desea encontrar el primer elemento que coincida Ejemplo con un for en un array 1) for(i=0;i<n;i++){ 2) if(array[i]==elementoABuscar){ 3) System.out.println(Numero encontrado); 4) Break; 5) } 6) } Siendo: N es el tamao del arreglo menos uno(array.lenght-1) elementoABuscar es un entero que contiene el elemento a buscar break es para que detenga el ciclo del for en caso de encontrar el numero

Ejemplo con un while buscando en un archivo: 1) 2) 3) 4) 5) 6) 7) Scanner sc = new Scanner(new File(Data.in)); int n=7; while(sc.hasNextInt()){ if(sc.nextInt()==n){ System.out.println(Numero encontrado); } }

37

Bsqueda Binaria

Esta bsqueda se basa en el dicho divide y vencers, es el mtodo de bsqueda ms eficiente pero para poder utilizarlo se necesita que el arreglo en el que estn almacenados los datos este ordenado. La temtica de bsqueda es la siguiente: primero se obtiene la posicin media del arreglo y se compara el elemento de la posicin media con el elemento a buscar, si no es el elemento que se busca se compara el elemento a buscar con el elemento de la posicin media si el elemento es mayor repite el proceso pero solo con los elementos que son mayores que l, en caso de que el elemento sea menor se repite el proceso con los elementos menores. Y as hasta encontrar el elemento o que las posiciones menores y mayores choquen(ver el ejemplo).

Ejemplo
1) 2) 3) 4) 5) int array[]={1,2,3,4,5,6,7,8,9,10}; int n=3; int posIni=0; int posFin=array.length-1; int posCen;

6) while(posIni<=posFin){ 7) posCen=(posIni+posFin)/2; 8) if(array[posCen]==n){ 9) System.out.println("Dato encontrado!!! el numero estaba entre las posiciones "+posIni+" y "+posFin+" y estaba en la posicion "+posCen); 10) break; 11) }else if(n<array[posCen]){ 12) posFin=posCen-1; 13) }else{ 14) posIni=posCen+1; 15) } 16) }

38

Explicacin: Primero se crea el arreglo que tiene que estar previamente ordenado en este caso del 1 al 10(lnea 1) n es el nmero a buscar(Lnea 2) Se crean posIni, posFin, y posCen , estos datos son muy importantes ya vamos a utilizar estos enteros para encontrar el nmero que busquemos. o La posicin inicial por defecto es 0(posIni=0),(Lnea 3) o La posicin Final por defecto es el tamao del arreglo menos 1(posFin=array.length-1), (lnea 4) Se va a repetir hasta que la posicin inicial sea mayor que la posicin final o hasta que encuentre el dato(lnea 6) Se determina la posicin media se suma la posicin inicial con la posicin final y el resultado se divide entre dos(Lnea 7) Despus se compara si el dato en la posicin central es igual al nmero que buscamos(Lnea 8) Se pone un mensaje para avisar que si se encontr el dato y en que subarreglo se encontr(Lnea 9) Detiene el bucle(linea10) Se compara n con el elemento medio(lnea 11) si es menor entonces: o La posicin inicial toma el valor de la posicin central menos 1(lnea 12) o Porque como el arreglo esta ordenado el numero buscado se encuentra el subarreglo menor Si no es menor entonces: o La posicin final toma el valor de la posicin central mas 1(lnea 14) o Porque como el arreglo esta ordenado el numero buscado se encuentra el subarreglo mayor Y se repite hasta que encuentre el dato o que la posicin inicial sea mayor o igual que la posicin menor.

39

Bsqueda por Hash


Mtodo consistente en aplicar una funcin que traduce un conjunto de posibles valores llave en un rango de direcciones relativas, y se almacenan en forma de tablas por ejemplo:

Casos de colisin Si dos llaves generan un hash apuntando al mismo ndice, los registros correspondientes no pueden ser almacenados en la misma posicin. En estos casos, cuando una casilla ya est ocupada, debemos encontrar otra ubicacin donde almacenar el nuevo registro, y hacerlo de tal manera que podamos encontrarlo cuando se requiera. Soluciones para la resolucin de problemas Propagar los registros: Buscar funciones que distribuyan muy aleatoriamente los registros podemos evitar "agrupaciones" de llaves que produzcan las mismas direcciones

Usar memoria extra: El uso de memoria extra se basa en proponer un espacio de direcciones posibles mucho ms grande que el nmero de registros a usar, de modo que si vamos a insertar 100 registros.

40

Colocar ms de un registro en una direccin: Este concepto se basa en "buckets" o cubetas de datos en cada direccin, ah se colocan algunos (casi todos) los registros que colisionan de manera que al hacer una bsqueda debemos recuperar la cubeta entera y ahi buscar por el registro deseado.

Algoritmo de hash
No existe una frmula "nica" para hash, pero el producirla es un algoritmo que bsicamente se presenta en 3 pasos: 1) Representar la llave de manera numrica (siempre que no sea de por s un nmero) Una buena opcin es usar los valores ASCII o bien los Unicode de las letras LOWELL= L O W E L L _ _ _ _ _ _ 76 79 87 69 76 76 32 32 32 32 32 32 2) Plegar y Agregar Combinar algunos de estos nmeros para generar pequeos trozos con los que podamos trabajar 76 79 | 87 69 | 76 76 | 32 32 | 32 32 | 32 32 De manera que podemos hacer algunas operaciones matemticas con dichos nmeros para finalmente obtener un nmero del cual obtendremos la direccin 7679 + 8769 + 7676 + 3232 + 3232 = 30 588 Nota: Respecto a la implementacin se puede dar el caso de formar nmeros demasiado grandes, tanto que llegue al overflow del tipo de datos que estemos usando. 3) Dividir por un nmero primo y usar el resultado como direccin Los archivos de hash por lo general suelen limitarse a un cierto rango de direcciones posibles para aprovechar mejor el concepto de memoria

41

Ventajas
Se pueden usar los valores naturales de la llave, puesto que se traducen internamente a direcciones fciles de localizar Se logra independencia lgica y fsica, debido a que los valores de las llaves son independientes del espacio de direcciones No se requiere almacenamiento adicional para los ndices.

Desventajas
No pueden usarse registros de longitud variable El archivo no esta clasificado No permite llaves repetidas Solo permite acceso por una sola llave

Factores de Eficiencia
La distribucin de los valores de llave que realmente se usan El numero de valores de llave que realmente estn en uso con respecto al tamao del espacio de direcciones El numero de registros que pueden almacenarse en una direccin dad sin causar una colisin La tcnica usada para resolver el problema de las colisiones

Tipos de funcin de hash


Residuo de la divisin Medio del cuadrado Pliegue

42

Anlisis de los algoritmos


En las Ciencias de la Computacin cuando se dice que un problema tiene Solucin, bajo este enfoque es posible dividir los criterios en dos clases: a) Criterios orientados a minimizar el costo de desarrollo: claridad, sencillez Y facilidad de implantacin, depuracin y mantenimiento. b) Criterios orientados a disminuir el costo de ejecucin: tiempo de procesador Y cantidad de memoria utilizados.

COMPLEJIDAD EN EL TIEMPO
Una medida que suele ser til conocer es el tiempo de ejecucin de un programa en funcin de N, lo que denominaremos T(N). Esta funcin se puede medir fsicamente (ejecutando el programa, reloj en mano), o calcularse sobre el cdigo contando instrucciones a ejecutar y multiplicando por el tiempo requerido por cada instruccin. As, un trozo sencillo de programa como S1; for (int i= 0; i < N; i++) S2; Requiere T(N)= t1 + t2*N Siendo t1 el tiempo que lleve ejecutar la serie "S1" de sentencias, y t2 el que lleve la serie "S2". Prcticamente todos los programas reales incluyen alguna sentencia condicional, haciendo que las sentencias efectivamente ejecutadas dependan de los datos concretos que se le presenten. Esto hace que ms que un valor T(N) debamos hablar de un rango de valores Tmin(N) <= T(N) <= Tmax(N) Los extremos son habitualmente conocidos como "caso peor" y "caso mejor". Entre ambos se hallara algn "caso promedio" o ms frecuente.

43

Cualquier frmula T(N) incluye referencias al parmetro N y a una serie de constantes "Ti" que dependen de factores externos al algoritmo como pueden ser la calidad del cdigo generado por el compilador y la velocidad de ejecucin de instrucciones del ordenador que lo ejecuta. Dado que es fcil cambiar de compilador y que la potencia de los ordenadores crece a un ritmo vertiginoso (en la actualidad, se duplica anualmente), intentaremos analizar los algoritmos con algn nivel de independencia de estos factores; es decir, buscaremos estimaciones generales ampliamente vlidas. Aplica la complejidad en el siguiente algoritmo.

1 2 3 4 5 6 7 8 9 10 11

funcin ejemplo3(n:entero): entero empieza variables i, j, k enteros para i=1 hasta n hacer para j=n hasta 1 hacer k=k+j k=k+i fin para fin para devolver k termina

COMPLEJIDAD EN EL ESPACIO

La misma idea que se utiliza para medir la complejidad en tiempo de un algoritmo se utiliza para medir su complejidad en espacio. Decir que un programa es O(N) en espacio significa que sus requerimientos de memoria aumentan proporcionalmente con el tamao del problema.

44

EFICIENCIA DE LOS ALGORITMOS El tiempo de ejecucin de un Algoritmo depende de: El tamao de los datos a procesar. Calidad del cdigo generado por el Compilador/Intrprete

Velocidad del computador.

Mtodo emprico o a posteriori Desventajas: No permite la comparacin de algoritmos sobre diversos soportes-Requiere el esfuerzo de programar cada uno de los algoritmos para determinar el mejor-Slo ser posible comparar los tiempos para algunos tamaos del problema. Mtodo terico o a priori Ventajas: Analiza el algoritmo y no el programa concreto resultado independiente de la mquina y del lenguaje-La expresin matemtica que da el tiempo de ejecucin es dependiente del tamao del problema-Nos evitamos programar el o los algoritmos

COMPLEJIDAD DE ALGORITMOS

La memoria y el tiempo de procesador son los recursos sobre los cuales se concentra todo el inters en el anlisis de un algoritmo, as pues distinguiremos dos clases de funcin complejidad: a) Funcin complejidad espacial. Mide la cantidad de memoria que necesitar un algoritmo para resolver un problema de tamao n: b) Funcin complejidad temporal. Indica la cantidad de tiempo que requiere un algoritmo para resolver un problema de tamao n; viene a ser una medida de la cantidad de CPU que requiere el algoritmo.

45

You might also like