Investigacion 2 (1)

30
UTP Profesora: Carmen Rovira 10 de Septiembre de 2015 INVESTIGACION 2 Erick Cedeño Edgar Delgado Jesus Sarmiento

description

para tic

Transcript of Investigacion 2 (1)

Page 1: Investigacion 2 (1)

Profesora: Carmen Rovira

10 de Septiembre de 2015

UTP INVESTIGACION 2

Erick Cedeño

Edgar Delgado

Jesus Sarmiento

Page 2: Investigacion 2 (1)

METODOS DE BUSQUEDA Y ORDENAMIENTO

El ordenamiento de los datos implica una importante mejora de la eficiencia en la búsqueda de los mismos.

Existen dos técnicas básicas de ordenamiento: ordenamientos internos y ordenamientos externos. Los métodos de ordenamiento interno se aplican cuando el conjunto de datos a clasificar es lo suficientemente pequeño, de tal forma que pueda caber en memoria principal.

El tiempo requerido para leer o escribir registros no se considera significativo para la evaluación del rendimiento interno. Los métodos de ordenamiento externo se aplican a grandes volúmenes de datos, que residen parcial o totalmente en dispositivos de almacenamiento secundario, tales como los discos. Aquí, el tiempo de acceso de lectura y escritura influye en la determinación de la eficiencia del ordenamiento.

En esta sección analizaremos en detalle seis de los métodos de ordenamiento más utilizados:

Selección Inserción Burbuja MergeSort QuickSort HeapSort

La idea básica de un ordenamiento por selección es la selección repetida de la llave menor restante en una lista de datos no clasificados, como la siguiente llave (dato o registro), en una lista de datos ordenada que crece.

La totalidad de la lista de llaves no ordenadas, debe estar disponible, para que nosotros podamos seleccionar la llave con valor mínimo en esa lista. Sin embargo, la lista ordenada, podrá ser puesta en la salida, a medida que avancemos.

Por ejemplo, consideremos la siguiente lista de llaves no ordenadas:

El primer paso de selección identifica el 2 como valor mínimo, lo saca de dicha lista y lo agrega como primer elemento en una nueva lista ordenada.

Page 3: Investigacion 2 (1)

El segundo paso identifica el 3 como el siguiente elemento mínimo y lo retira de la lista para incluirlo en la nueva lista de elementos ordenados.

Después del sexto paso, tenemos la siguiente lista.

Para una lista de n registros, este algoritmo requiere n pasadas sobre la lista no ordenada. En la i-ésima pasada, se habrán hecho n-i comparaciones de llaves. Por lo tanto, el número total de comparaciones será:

La cual da n(n-1)/2. Esta ordenación se dice que requiere O(n^2) comparaciones, porque el término n^2 domina a la expresión. El número de comparaciones es proporcional al cuadrado del número de llaves en el conjunto. Así que, duplicar el número de llaves, significará que el proceso tomará cuatro veces más tiempo.

Vemos que este método de ordenamiento implementado como lo está, requiere dos veces más espacio del necesario, debido al uso de dos listas. Una modificación a este método de selección puede ser un método por selección con intercambio, en el cual la llave seleccionada es movido a su posición final por intercambio con la llave que inicialmente ocupaba esa posición. Consideremos otra vez la lista no clasificada:

Después del primer paso, 2 es seleccionado,

Page 4: Investigacion 2 (1)

Después del segundo paso, 3 es el seleccionado,

Después del sexto paso,

El ordenamiento por selección con intercambio tiene esencialmente los mismos requerimientos de comparaciones que el ordenamiento por selección original, es de O(n^2).

Una implementación de este método de ordenamiento puede ser:

void Seleccion(Lista Numeros,int Largo){    int pos1,menor,recorre,auxiliar;    /*comienza en la primera posicion y llega hasta uno antes del fin*/    for(pos1=0;pos1<(Largo-1);pos1++)    {        for(menor=pos1,recorre=pos1+1;recorre<Largo;recorre++)            if(Numeros[menor]>Numeros[recorre])menor=recorre;        auxiliar=Numeros[menor];        Numeros[menor]=Numeros[pos1];        Numeros[pos1]=auxiliar;    };};

Page 5: Investigacion 2 (1)

Ordenamiento por Inserción 

La idea básica de una clasificación por inserción es tomar la siguiente llave de una lista no clasificada e insertarla en su posición relativa correspondiente en una lista creciente de datos clasificados. 

La lista completa de llaves ordenadas deberá estar disponible, a lo largo del proceso, para poder insertar una llave en su posición relativa apropiada. La lista puede alimentarse durante el proceso.

Compare esta técnica de ordenamiento con el método de ordenamiento por selección. Cuando usted ordena una mano de cartas de juego, si usted toma cada carta cuando se la entregan y la coloca en la ranura apropiada, con respecto a las demás cartas que ya tiene, entonces está usando un ordenamiento por inserción. Sin embargo, si usted espera hasta que ña mano entera se reparta, después procede a identificar qué carta debe ir más a la izquierda y la coloca, y así para cada una, se dice entonces que está usando ordenamiento por selección.Ambas técnicas son relativamente pobres, pues cada una es de O(n^2), pero cada una es relativamente fácil, de comprender y de programar. Ambas son muy utilizadas.

Considere otra vez nuestro ejemplo de listas de llaves no clasificadas:

Como con el método de ordenamiento por selección, el ordenamiento por inserción también puede ser implementado para que funcione sobre una sola

Page 6: Investigacion 2 (1)

lista (o espacio de trabajo) al hacer que el elemento que se está analizando sea insertado entre los que ya han sido analizados y ordenados, vemos esto gráficamente:

Se mueve el elemento (en este caso el 2) hasta la posición que le corresponde y luego se sigue con los demás en la misma forma, lográndose el efecto de la inserción.

Una implementación de este método de ordenamiento puede ser la siguiente:

void Insercion(Lista Numeros, int Largo){    int pos1, auxiliar,pos2;    for(pos1=1;pos1<Largo;pos1++)    {        pos2=pos1;        while((pos2>0)&&(Numeros[pos2]<Numeros[pos2-1]))        {            auxiliar=Numeros[pos2];            Numeros[pos2]=Numeros[pos2-1];            Numeros[pos2-1]=auxiliar;            pos2–;        };    };};

 

Ordenamiento por Burbuja 

La idea básica de este método de ordenamiento es la de comparar pares de valores de llaves e intercambiarlos si no están en sus posiciones relativas correctas. 

Como los métodos de selección e inserción vistos anteriormente, el método de burbuja requiere O(n^2) comparaciones. No obstante, el método de la burbuja es frecuentemente usado. 

La idea de este método es la de permitir que cada llave flote a su posición adecuada a través de una serie de pares de comparaciones e intercambios con

Page 7: Investigacion 2 (1)

los valores adyacentes. Cada paso haces que una llave suba a su posición final, como una burbuja, en la lista ordenada.

Consideremos otra vez nuestro ejemplo de lista de llaves no ordenadas:

Cada llave se compara con la llave que está encima de ella (en nuestro caso al lado derecho de ella) y se intercambia, si la llave de arriba es más pequeña. Cuando una llave mayor que la llave sujeto se encuentra, la llave sujeto queda encima, y el proceso continúa. Después de la pasada, todas las llaves arriba de la última por intercambiar deberán estar en su posición final. No necesitarán examinarse en pasos posteriores.

La actividad del primer paso sube a 14, a 22 y a 25.

El método de la burbuja en realidad es muy poco recomendado, sin embargo, es muy conocido (tal vez debido a su nombre) y desafortunadamente muy utilizado (puede ser debido a su relativa facilidad de implementación). Su comportamiento es un poco parecido al método de intercambio selectivo, en el cual las llaves más pequeñas bajan al fondo de la lista.

Este método de ordenamiento también puede funcionar con 2 listas, una de llaves desordenadas y otra de llaves ordenadas, pasando el elemento que flota hasta el final a la lista de ordenados, pero para minimizar el espacio utilizado,

Page 8: Investigacion 2 (1)

trabajaremos con una sola lista.

Una implementación del método de ordenamiento por burbuja puede ser el siguiente:

void Burbuja(Lista Numeros, int Largo){    int ultimo=Largo-1;    int posicion;    int auxiliar;    while(ultimo>=1)    {        for(posicion=0;posicion<ultimo;posicion++)        {            if(Numeros[posicion]>Numeros[posicion+1])            {                auxiliar=Numeros[posicion];                Numeros[posicion]=Numeros[posicion+1];                Numeros[posicion+1]=auxiliar;            };        };        ultimo–;    };};

Page 9: Investigacion 2 (1)

Ordenamiento por Mergesort 

Este método de ordenamiento toma la lista de llaves y la divide en dos partes, las cuales se ordenan en forma independiente. Finalmente, las dos listas ordenadas resultantes, se mezclan para formar la lista ordenada final.

Visualmente se puede apreciar de la siguiente manera:

Por ejemplo, realicemos el seguimiento para una lista con los siguientes datos:

7 – 5 – 3 – 9 – 8 – 2 – 6 – 1

La lista de llaves se divide en 2 partes iguales,

Lista1: 7 – 5 – 3 – 9Lista2: 8 – 2 – 6 – 1

Aplicamos el método de ordenamiento nuevamente para cada una de las listas:

 Una implementación de este método de ordenamiento puede ser:

Lista b;void MergeSort(Lista a, int l, int r){    int i,j,k,m;    if (r > l)    {        m = (r+l) /2;        MergeSort(a, l, m);        MergeSort(a, m+1, r);

Page 10: Investigacion 2 (1)

        for (i= m+1; i>l;i–)            b[i-1] = a[i-1];        for (j= m; j < r; j++)            b[r+m-j] = a[j+1];        for (k=l ; k<=r; k++)            a[k] = (b[i] < b[j]) ? b[i++] : b[j–];    };};

  

El orden de este método de ordenamiento es de  , el cual se desprende de su ecuación de recurrencia:

Page 11: Investigacion 2 (1)

Ordenamiento por Quicksort 

Considerado uno de los mejores métodos de ordenamiento, se le atribuye su creación a C.A. R. Hoare (1962). 

La idea básica del método Quicksort es la siguiente:

1. Se selecciona una llave en particular de la lista. Esta llave se puede escoger aleatoriamente o haciendo la media de un pequeño conjunto de llaves tomados de la lista. El valor óptimo sería aquél que esté precisamente en medio del rango de valores. Esto se hace para evitar el peor caso de Quicksort, que es seleccionar una llave del extremo. No obstante, incluso en el peor de los casos Quicksort funciona correctamente.

2. Se divide la lista en dos partes, una con todos los elementos menores o iguales que la llave seleccionada y otra con todos los elementos mayores o iguales.

3. Se repiten los puntos 1 y 2 para cada parte restante hasta que la lista esté ordenada.

El proceso descrito es esencialmente recursivo.

Veamos ahora un ejemplo práctico de cómo funciona este método de ordenamiento: consideremos la siguiente lista de elementos:

7 – 5 – 3 – 8 – 9 – 10 – 14 – 6 – 4 – 1

Supongamos que el elemento que se seleccionó al azar fue el 8, entonces nuestra lista se divide en dos partes, una con los mayores y una con los menores que el 8. 

Si trabajamos con L1, supongamos que seleccionamos el elemento 4 al azar, entonces nuestra lista se divide en dos partes, una con los mayores y una con los menores que el 4.

Así sucesivamente hasta que se llega a una lista con dos elementos, los cuales se comparan y se retornan en orden.

Page 12: Investigacion 2 (1)

Lo mismo sucede con la L2 del comienzo (L2: 9 – 10 – 14), hasta que se obtienen la lista con dos elementos los cuales se ordenan y se retornan.

Al finalizar, ambas listas estarán ordenadas (tanto la que tenía los mayores como la que tenía los menores que la llave seleccionada) y la lista completa estará ordenada.

Análisis de Rendimiento:

El primer paso se ve de la siguiente forma:

El segundo paso:

Procesar la sublista 1 requiere aproximadamente  comparaciones, lo mismo que para procesar la lista 2. De hecho, el proceso de cada superpaso requiere O(n) comparaciones.

En promedio se requieren  superpasos para clasificar la lista completa.

Luego el método de Quicksort requiere de un promedio de comparaciones. Este es el mejor desempeño encontrado hasta aquí en una técnica de ordenamiento; recordemos que los métodos lineales requieren todos de O(n^2) comparaciones.

Una implementación de este método de ordenamiento puede ser la siguiente:

void qs(Lista Numeros, int inf, int sup){    int izq=inf, der=sup, mitad, x;    mitad=Numeros[(izq+der)/2];    do{        while((Numeros[izq]<mitad)&&(izq<sup))izq++;        while((mitad<Numeros[der])&&(der>inf))der–;        if(izq<=der)

Page 13: Investigacion 2 (1)

        {            x=Numeros[izq], Numeros[izq]=Numeros[der], Numeros[der]=x;            izq++;            der–;        };    }while(izq<=der);    if(inf<der) qs(Numeros,inf,der);    if(izq<sup) qs(Numeros,izq,sup);};

void QuickSort(Lista Numeros, int n){    qs(Numeros,0,n-1);};

Cómo podrá apreciarse, este algoritmo selecciona el elemento medio de la lista de claves, ya que como se dijo anteriormente se trata de un número al azar. Lamentablemente, éste no considera el peor caso, pues puede darse el caso que el elemento medio sea exactamente un valor extremo de la lista, pero eso es un punto fácil de solucionar. A pesar de todo, esta implementación funciona bastante bien.

 

Page 14: Investigacion 2 (1)

Ordenamiento por Heapsort 

Su desempeño es en promedio tan bueno como el Quicksort y se comporta mejor que este último en los peores casos. Aunque el Heapsort tiene un mejor desempeño general que cualquier otro método presentado de clasificación interna, es bastante complejo de programar. El Heapsort fue desarrollado en 1964 por J. W. J. Williams.

El Heapsort está basado en el uso de un tipo especial de árbol binario (llamado apilamiento) para estructurar el proceso de ordenaiento. La estructura de ramificación del árbol conserva el número de comparaciones necesarias

en  .

La estructura de este árbol tiene las siguientes características:

» Las llaves están acomodadas en los nodos de tal manera que, para cada nodo i,Ki <= Kj donde el nodo j es el padre del nodo i. Es decir, al recorrer el camino desde la raíz hacia abajo, las claves se encuentran en orden descendente.

»El árbol se llena de izquierda a derecha, lo que implica que si algún(os) nodo(s) no está(n) en el mismo nivel que el resto, éste(os) estará(n) entonces lo más a la izquierda posible del árbol.

Veamos gráficamente un ejemplo de este tipo de árbol:

Al enumerar los nodos por niveles, de izquierda a derecha (como se aprecia en la figura), no es necesario usar punteros para almacenar el árbol.

En efecto, se puede usar un arreglo A[1..n], donde los hijos de A[i] son A[2*i] y A[2*i+1]. Así, la condición del Heap se puede reformular:

A[i] > A[2*i]A[i] > A[2*i+1]

Page 15: Investigacion 2 (1)

Luego un vector con las llaves quedaría de la siguiente forma:

73 – 50 – 36 – 21 – 46 – 27 – 9 – 18 – 10 – 30

Resumiendo, el ordenamiento por Heapsort realiza los siguientes pasos desde un punto de vista de un Heap (con los elementos) y una lista ordenada (inicialmente vacía):

1º. Saca el valor máximo del Heap. (El de la posición 1).2º. Pone el valor sacado en el arreglo ordenado.3º. Reconstruir el Heap con un elemento menos.

El proceso de sacar el máximo (la raíz) lleva en sí una serie de pasos más que son: 

** Toma el elemento de la raíz y lo intercambia con el elemento más a la derecha de la rama que esté en el nivel más bajo. Recordemos que el árbol (Heap) se llena de izquierda a derecha, con lo cual, el proceso de sacar la raíz se hace en forma inversa (Vaciando el árbol).

** Al intercambiar la raíz con el elemento antes mencionado, se produce un quiebre en las condiciones del Heap, con lo cual se debe reconstruir y volver a dejar en la raíz del árbol el elemento que es mayor que todos los demás.

Un algoritmo sencillo para visualizar cómo funciona este método de ordenamiento puede ser el siguiente:

void HeapSort(Lista Numeros){    Heap=Construir_Heap(Numeros);    while(Heap_vacio(Heap)==0)    {        Auxiliar=Extraer_Max(Heap);        Insertar(Ordenada, Auxiliar);        Ultimo=Ultimo_Heap(Heap);        Numeros=Coloca_Cabeza(Ultimo,Numeros);        Heap=Reconstruir_Heap(Heap);    };};

Otra forma de implementarlo sería la siguiente, realiza el proceso con un vector.

void swap(int &a,int &b){    int temp=a;    a=b;    b=temp;}

Page 16: Investigacion 2 (1)

void HeapSort(Lista vec,int n){    int i,j;    for (i=0;i<n;i++)    {        j=i+1;        while(j>1)            if (vec[j-1]>vec[j/2-1]){                swap(vec[j-1],vec[j/2-1]);                j/=2;            }            else                break;    }    for(i=n-1;i>0;i–)    {        swap(vec[0],vec[i]);        j=1;        while (j*2<i)            if (j*2+1>i)                if (vec[j-1]>vec[j*2-1])                    break;                else{                    swap(vec[j-1],vec[j*2-1]);                    j*=2;                }            else                if (vec[j*2-1]>vec[j*2])                    if (vec[j-1]>vec[j*2-1])                        break;                    else{                        swap(vec[j-1],vec[j*2-1]);                        j*=2;                    }                else                    if (vec[j-1]>vec[j*2])                        break;                    else{                        swap(vec[j-1],vec[j*2]);                        j*=2+1;                    }    }}

En promedio, el número requerido de comparaciones e intercambios para el

Heap Sort es:  lo cual es  . En el peor de los

casos, este número se incrementa a  . El peor caso no es mucho peor que el caso promedio. El método de ordenamiento por Heapsort garantiza

Page 17: Investigacion 2 (1)

un tiempo de proceso de  . Para un tamaño “n” muy grande, la complejidad del algoritmo está compensada por la eficiencia del método.

Page 18: Investigacion 2 (1)

Métodos de Búsqueda

La búsqueda es la operación más importante en el procesamiento de

información, ya que permite recuperar datos previamente almacenados. El

resultado de una búsqueda puede ser un éxito, si se encuentra la información o

un fracaso, si no la encuentra.

La búsqueda se puede aplicar sobre elementos previamente ordenados o sobre

elementos desordenados, en el primer caso la búsqueda es más fácil, en

cambio en el segundo se dificulta un poco más el proceso, sobre todo cuando

de se trata de encontrar una cantidad de elementos similares.

Los métodos de búsqueda se clasifican en:

-       Búsqueda interna.

-       Búsqueda externa.

Búsqueda Interna:

La búsqueda interna es aquella en la que todos los elementos de la estructura

estática (arreglo) o dinámica (lista ligada o árbol) se encuentran almacenados

en la memoria principal de la computadora.

Los métodos de búsqueda interna más importantes son:

-       Secuencial o lineal.

-       Binaria.

-       Hash (transformación de claves)

Page 19: Investigacion 2 (1)

Secuencial:

El método de búsqueda secuencial consiste en revisar la estructura de datos

elemento por elemento hasta encontrar el dato que estamos buscando, o hasta

llegar al final de la estructura de datos. Normalmente cuando una función de

búsqueda concluye con éxito, lo que interesa es conocer en qué posición fue

encontrado el elemento buscado. La búsqueda secuencial se puede aplicar a

estructuras de datos ordenadas o desordenadas.

Si se aplica a una estructura desordenada y el elemento que se está buscando

existe más de una vez en la estructura, el proceso de búsqueda debe continuar

hasta  que se llegue al fin de la estructura.

Ejemplo. Si tenemos una estructura con los elementos 5, 8, 3, 2, 9, 5, 7, 0, 5, 1

y estamos buscando el número 5, el resultado de la búsqueda nos mostraría

las posiciones 0, 5 y 8 y el proceso terminaría al llegar al numero 1 que es el

ultimo de la lista de elementos.

Elementos 5 8 3 2 9 5 7 0 5 1

Posiciones 0 1 2 3 4 5 6 7 8 9

Posiciones donde

encontró el número

5

√ × × × × √ × × √ ×

Ejercicio. Crear un programa que aplique una búsqueda secuencial de un dato

dentro de un arreglo de elementos desordenados y presenta la o las posiciones

donde encontró el dato.

En cambio con una estructura ordenada al encontrar el elemento por primera

vez podemos suponer que una vez que el elemento ya no sea igual al que

estamos buscando, ya no es necesario llegar hasta el fin de la estructura.

Page 20: Investigacion 2 (1)

Ejemplo. Si tenemos la estructura anterior pero ordenada 0, 1, 2, 3, 5, 5, 5, 7,

8, 9 y estamos buscando el mismo número 5, el resultado de la búsqueda nos

mostraría las posiciones  4, 5, y 6, y el proceso terminaría ya que el número 7

no es menor ni igual al que estamos buscando.

Elementos 0 1 2 3 5 5 5 7 8 9

Posiciones 0 1 2 3 4 5 6 7 8 9

Posiciones donde

encontró el número

5

× × × × √ √ √ ×    

Ejercicio. Crear un programa que aplique una búsqueda secuencial de un dato

dentro de un arreglo de elementos ordenados y presenta la o las posiciones

donde encontró el dato.

Page 21: Investigacion 2 (1)

Binaria:

El método de búsqueda binaria divide el total de los elementos en dos,

comparando el elemento buscado con el central, en caso de no ser iguales, se

determina si el elemento buscado es menor o mayor al central, para

determinar si la búsqueda continua del lado izquierdo (menor) o derecho

(mayor) del central, repitiendo el mismo proceso de división y comparación,

hasta encontrar el elemento buscado o que la división ya no sea posible.

Debemos destacar que este método de búsqueda solo funciona con estructuras

de datos previamente ordenadas, dividiendo cada vez a la mitad el proceso de

búsqueda, lo que hace que el método sea más eficiente.

Ejemplo. Si tenemos una estructura ordenada 0, 1, 2, 3, 5, 5, 5, 7, 8, 9 y

estamos buscando el número 5, el resultado de la búsqueda nos mostraría la

posicione  4 y el proceso terminaría ya que el elemento buscado no es

diferente al que está en la posición central.

Elementos 0 1 2 3 5 5 5 7 8 9

Posiciones 0 1 2 3 4 5 6 7 8 9

Posiciones donde

encontró el número

5

i       √         F

Este proceso debe sumar la posición inicial y la final, dividiendo el resultado de

la suma entre dos para obtener la posición central generada por el cociente de

la división, en este caso es (0+9)/2 = 4, esta posición se compara con el

elemento que estamos buscando y como son iguales la búsqueda se detiene

mostrando la posición donde lo encontró.

Ejercicio. Crear un programa que aplique una búsqueda binaria de un dato

dentro de un arreglo de elementos ordenados y presenta la posición donde

encontró el dato.

Page 22: Investigacion 2 (1)

Hash:

El método de búsqueda hash o por transformación de clave aumenta la

velocidad de búsqueda sin necesidad de que los elementos estén previamente

ordenados, comparándolo con los métodos anteriores. Además tiene la ventaja

de que el tiempo de búsqueda es independiente del número de elementos de

la estructura que los almacena.

Este método permite que el acceso a los datos sea por una llave que indica

directamente la posición donde están guardados los datos que se buscan.

Prácticamente trabaja con una función que transforma la llave o dato clave en

una dirección (índice) dentro de la estructura y que en ocasiones puede

generar una colisión, que se define como una misma dirección para dos o más

claves distintas.

Para trabajar con este método de búsqueda debe elegir previamente dos

cosas:

-       Una función hash que sea fácil de calcular y que distribuya

uniformemente las direcciones.

-       Un método para resolver colisiones, generando posiciones

alternativas.

Para encontrar la función hash no existe una regla que permita determinar cuál

será la función más apropiada para generar un conjunto de claves que

aseguren la máxima uniformidad en la distribución de las mismas. Algunas de

las funciones hash más utilizadas son las siguientes:

-       Función módulo (por división).

-       Función cuadrada.

-       Función plegamiento.

-       Función truncamiento.

Page 23: Investigacion 2 (1)

La función módulo o por división toma el residuo de la división entre la clave y

el total de elementos de la estructura, generando la siguiente fórmula:

            Dirección =  (clave % total elementos)

Para lograr una mayor uniformidad en la distribución de los elementos, se debe

buscar que el valor  que se usa en el total de elementos sea un número primo

más cercano al tamaño de la estructura.

Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y

9359, las direcciones generadas son las siguientes:

            Dirección = (7259%100) = 59

            Dirección = (9359%100) = 59

Estos dos casos generan una colisión, ya que los dos números no se pueden

asignar dentro de la misma dirección en la estructura, para evitar la colisión, se

cambia el valor de 100 por el numero primo más cercano a él, en este caso

sería un 97, lo que generaría las siguientes direcciones:

            Dirección = (7259%97) = 81

            Dirección = (9359%97) = 47

La función cuadrada como su nombre lo indica eleva al cuadrado la clave y del

resultado, se toman los dígitos centrales como la dirección. El número de

dígitos a tomar se determina del por el rango del índice de toda la estructura.

La fórmula hash es la siguiente:

                       Dirección = dígitos centrales (clave2)

Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y

9359, las direcciones generadas son las siguientes:

            Dirección = dígitos centrales (72592) = 52693081 = 93

            Dirección = dígitos centrales (93592) = 87590881 = 90

Page 24: Investigacion 2 (1)

Como el rango de claves es de 1 a 100 se toman dos dígitos centrales.

La función plegamiento divide la clave en partes de igual número de dígitos (la

última puede tener menos dígitos), tomando como dirección los dígitos menos

significativos, después de realizar una operación entre las partes, ya sea una

serie de sumas o de multiplicaciones. La fórmula seria la siguiente:

            Dirección = dígitos menos significativos (suma de partes)

Dirección = dígitos menos significativos (multiplicación de partes)

Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y

9359, las direcciones generadas son las siguientes:

            Dirección =    dígitos menos significativos (72 + 59) =

                                   dígitos menos significativos (131) = 31

            Dirección =    dígitos menos significativos (93 + 59) =

                                   dígitos menos significativos (152) = 52

Como el rango de claves es de 1 a 100 se toman dos dígitos para las

particiones y para la dirección.

La función truncamiento toma algunos de los dígitos de las claves y forma con

ellos una dirección. La elección de los dígitos es arbitraria, podrían tomarse los

de las posiciones pares o impares para con ellos generar la dirección donde se

almacenara la clave, uniendo los dígitos de izquierda a derecha o de derecha a

izquierda, su fórmula es la siguiente:

Dirección = elegir dígitos (unión dígitos)

Ejemplo. Si tenemos un total de 100 elementos y dos claves que sean 7259 y

9359, las direcciones generadas son las siguientes:

Dirección = elegir dígitos (7, 5) = 75

Dirección = elegir dígitos (9, 5) = 95

Page 25: Investigacion 2 (1)

Para este caso se tomaron los dígitos impares y se unieron de izquierda a

derecha.

Búsqueda Externa:

La búsqueda externa es aquella en la que todos los elementos se encuentran

almacenados en un archivo, el cual se encuentra en un dispositivo de

almacenamiento secundario como un disco duro, una cinta o una memoria usb.

Los métodos de búsqueda externa más importantes son:

-       Secuencial.

-       Binaria.

-       Hash (transformación de claves)

Secuencial:

El método de búsqueda secuencial externa consiste en revisar el archivo

elemento por elemento hasta encontrar el dato que se está buscando, o hasta

llegar al final del archivo. Este método de búsqueda se puede aplicar a

archivos ordenadas o desordenadas.

Si la búsqueda se aplica a un archivo desordenado y el elemento que se está

buscando existe más de una vez, el proceso de búsqueda debe continuar

hasta  que se llegue al fin del archivo.

Ejercicios. Crear un programa que genera N números aleatorios, los guarde en

un archivo y posteriormente aplique la búsqueda secuencial.

Si la búsqueda se aplica a un archivo ordenado y el elemento que se está

buscando existe más de una vez, el proceso de búsqueda termina cuando el

elemento del archivo que se está comparando es mayor que el que se está

buscando.

Page 26: Investigacion 2 (1)

Ejercicios. Crear un programa que genera N números aleatorios, los guarde en

un archivo, los ordene de forma ascendente y posteriormente aplique la

búsqueda secuencial.

Binaria:

 El método de búsqueda binaria externa utiliza el mismo principio que la

búsqueda binaria interna. Divide el total de elementos del archivo en dos,

comparando el elemento buscado con el central, en caso de no ser iguales se

determina si el elemento buscado es menor o mayor al central, para

determinar si la búsqueda continua del lado izquierdo (menor) o derecho

(mayor) del central, repitiendo el mismo proceso de división y comparación,

hasta encontrar el elemento buscado o que la división ya no sea posible.

 El archivo debe estar ordenado y se debe conocer el número de elementos del

mismo para aplicar este método.

 Ejercicios. Crear un programa que genera N números aleatorios, los guarde en

un archivo y posteriormente aplique la búsqueda binaria.

Page 27: Investigacion 2 (1)

Bibliografía 

* Loomiz: “Estructuras de Datos y Organización de Archivos”

* Cevallos: “C++”

http://www.algoritmia.net/articles.php?id=32

http://iutprogramacion.blogspot.com/2013/02/metodos-de-ordenamiento.html

https://sites.google.com/site/estdatjiq/home/unidad-v

http://librosweb.es/libro/algoritmos_python/capitulo_19/ordenamiento_por_seleccion.html

https://sites.google.com/site/estdatjiq/home/unidad-vi

http://macabremoon0.tripod.com/id2.html

https://www.youtube.com/watch?v=7qv1An90q2Q