Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad


Algoritmos de Ordenamiento y Búsqueda: Una Introducción a los Conceptos Fundamentales, Apuntes de Algoritmos y Programación

GUIA DE ESTUDIO PARA EXAMEN DE ALGORITMOS

Tipo: Apuntes

2019/2020

Subido el 24/08/2021

andres-eduardo-6
andres-eduardo-6 🇲🇽

5

(1)

7 documentos

1 / 7

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
ALGORITMOS DE ORDENAMIENTO Y BUSQUEDA
ALGORITMOS DE ORDENAMIENTO
Ordenamiento es la operación de arreglar los registros de una tabla en algún orden secuencial de
acuerdo a un criterio de ordenamiento. El ordenamiento se efectúa con base en el valor de algún
campo en un registro. El propósito principal de un ordenamiento es el de facilitar las búsquedas de
los miembros del conjunto ordenado.
Ej. de ordenamientos:
Dir. telefónico, tablas de contenido, bibliotecas y diccionarios, etc.
El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una
secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso
alfanumérico, ascendente o descendente. Conviene utilizar un método de ordenamiento cuando
se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo.
Tipos de ordenamientos:
Los 2 tipos de ordenamientos que se pueden realizar son: los internos y los externos.
Los internos: Son aquellos en los que los valores a ordenar están en memoria principal, por lo que
se asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo (a[1],
a[500], etc.).
Los externos: Son aquellos en los que los valores a ordenar están en memoria secundaria (disco,
cinta, cilindro magnético, etc.), por lo que se asume que el tiempo que se requiere para acceder a
cualquier elemento depende de la última posición accesada (posición 1, posición 500, etc.).
En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone
elementos de una lista o un vector en una secuencia dada por una relación de orden, es decir, el
resultado de salida ha de ser una permutación —o reordenamiento— de la entrada que satisfaga
la relación de orden dada. Las relaciones de orden más usadas son el orden numérico y el orden
lexicográfico. Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos
(como los de búsqueda y fusión) que requieren listas ordenadas para una ejecución rápida.
También es útil para poner datos en forma canónica y para generar resultados legibles por
humanos.
Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran cantidad
de investigación, tal vez debido a la complejidad de resolverlo eficientemente a pesar de su
planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde 1956.1 Aunque
muchos puedan considerarlo un problema resuelto, nuevos y útiles algoritmos de ordenamiento se
siguen inventado hasta el día de hoy (por ejemplo, el ordenamiento de biblioteca se publicó por
primera vez en el 2004). Los algoritmos de ordenamiento son comunes en las clases introductorias
a la computación, donde la abundancia de algoritmos para el problema proporciona una gentil
introducción a la variedad de conceptos núcleo de los algoritmos, como notación de O mayúscula,
algoritmos divide y vencerás, estructuras de datos, análisis de los casos peor, mejor, y promedio,
y límites inferiores.
Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:
La más común es clasificar según el lugar donde se realice la ordenación
oAlgoritmos de ordenamiento interno: en la memoria del ordenador.
oAlgoritmos de ordenamiento externo: en un lugar externo como un disco duro.
Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o
inversamente ordenadas:
pf3
pf4
pf5

Vista previa parcial del texto

¡Descarga Algoritmos de Ordenamiento y Búsqueda: Una Introducción a los Conceptos Fundamentales y más Apuntes en PDF de Algoritmos y Programación solo en Docsity!

ALGORITMOS DE ORDENAMIENTO Y BUSQUEDA

ALGORITMOS DE ORDENAMIENTO

Ordenamiento es la operación de arreglar los registros de una tabla en algún orden secuencial de acuerdo a un criterio de ordenamiento. El ordenamiento se efectúa con base en el valor de algún campo en un registro. El propósito principal de un ordenamiento es el de facilitar las búsquedas de los miembros del conjunto ordenado. Ej. de ordenamientos: Dir. telefónico, tablas de contenido, bibliotecas y diccionarios, etc. El ordenar un grupo de datos significa mover los datos o sus referencias para que queden en una secuencia tal que represente un orden, el cual puede ser numérico, alfabético o incluso alfanumérico, ascendente o descendente. Conviene utilizar un método de ordenamiento cuando se requiere hacer una cantidad considerable de búsquedas y es importante el factor tiempo. Tipos de ordenamientos: Los 2 tipos de ordenamientos que se pueden realizar son: los internos y los externos. Los internos: Son aquellos en los que los valores a ordenar están en memoria principal, por lo que se asume que el tiempo que se requiere para acceder cualquier elemento sea el mismo (a[1], a[500], etc.). Los externos: Son aquellos en los que los valores a ordenar están en memoria secundaria (disco, cinta, cilindro magnético, etc.), por lo que se asume que el tiempo que se requiere para acceder a cualquier elemento depende de la última posición accesada (posición 1, posición 500, etc.). En computación y matemáticas un algoritmo de ordenamiento es un algoritmo que pone elementos de una lista o un vector en una secuencia dada por una relación de orden, es decir, el resultado de salida ha de ser una permutación —o reordenamiento— de la entrada que satisfaga la relación de orden dada. Las relaciones de orden más usadas son el orden numérico y el orden lexicográfico. Ordenamientos eficientes son importantes para optimizar el uso de otros algoritmos (como los de búsqueda y fusión) que requieren listas ordenadas para una ejecución rápida. También es útil para poner datos en forma canónica y para generar resultados legibles por humanos. Desde los comienzos de la computación, el problema del ordenamiento ha atraído gran cantidad de investigación, tal vez debido a la complejidad de resolverlo eficientemente a pesar de su planteamiento simple y familiar. Por ejemplo, BubbleSort fue analizado desde 1956.^1 Aunque muchos puedan considerarlo un problema resuelto, nuevos y útiles algoritmos de ordenamiento se siguen inventado hasta el día de hoy (por ejemplo, el ordenamiento de biblioteca se publicó por primera vez en el 2004). Los algoritmos de ordenamiento son comunes en las clases introductorias a la computación, donde la abundancia de algoritmos para el problema proporciona una gentil introducción a la variedad de conceptos núcleo de los algoritmos, como notación de O mayúscula, algoritmos divide y vencerás, estructuras de datos, análisis de los casos peor, mejor, y promedio, y límites inferiores. Los algoritmos de ordenamiento se pueden clasificar de las siguientes maneras:  La más común es clasificar según el lugar donde se realice la ordenación o Algoritmos de ordenamiento interno: en la memoria del ordenador. o Algoritmos de ordenamiento externo: en un lugar externo como un disco duro.  Por el tiempo que tardan en realizar la ordenación, dadas entradas ya ordenadas o inversamente ordenadas:

o Algoritmos de ordenación natural: Tarda lo mínimo posible cuando la entrada está ordenada. o Algoritmos de ordenación no natural: Tarda lo mínimo posible cuando la entrada está inversamente ordenada.  Por estabilidad: un ordenamiento estable mantiene el orden relativo que tenían originalmente los elementos con claves iguales. Por ejemplo, si una lista ordenada por fecha se reordena en orden alfabético con un algoritmo estable, todos los elementos cuya clave alfabética sea la misma quedarán en orden de fecha. Otro caso sería cuando no interesan las mayúsculas y minúsculas, pero se quiere que si una clave aBC estaba antes que AbC, en el resultado ambas claves aparezcan juntas y en el orden original: aBC, AbC. Cuando los elementos son indistinguibles (porque cada elemento se ordena por la clave completa) la estabilidad no interesa. Los algoritmos de ordenamiento que no son estables se pueden implementar para que sí lo sean. Una manera de hacer esto es modificar artificialmente la clave de ordenamiento de modo que la posición original en la lista participe del ordenamiento en caso de coincidencia. Los algoritmos se distinguen por las siguientes características:  Complejidad computacional (peor caso, caso promedio y mejor caso) en términos de n, el tamaño de la lista o arreglo. Para esto se usa el concepto de orden de una función y se usa la notación O(n). El mejor comportamiento para ordenar (si no se aprovecha la estructura de las claves) es O(n log n). Los algoritmos más simples son cuadráticos, es decir O(n²). Los algoritmos que aprovechan la estructura de las claves de ordenamiento (p. ej. bucket sort) pueden ordenar en O(kn) donde k es el tamaño del espacio de claves. Como dicho tamaño es conocido a priori, se puede decir que estos algoritmos tienen un desempeño lineal, es decir O(n).  Uso de memoria y otros recursos computacionales. También se usa la notación O(n). Clasificación de los algoritmos de ordenamiento de información: El hecho de que la información está ordenada, nos sirve para poder encontrarla y accesarla de manera más eficiente ya que de lo contrario se tendría que hacer de manera secuencial. A continuación se describirán 4 grupos de algoritmos para ordenar información: a) Algoritmos de inserción: En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posición apropiada con respecto al resto de los elementos ya ordenados. Entre estos algoritmos se encuentran el de INSERCION DIRECTA, SHELL SORT, INSERCION BINARIA y HASHING. b) Algoritmos de intercambio: En este tipo de algoritmos se toman los elementos de dos en dos, se comparan y se INTERCAMBIAN si no están en el orden adecuado. Este proceso se repite hasta que se ha analizado todo el conjunto de elementos y ya no hay intercambios. Entre estos algoritmos se encuentran el BURBUJA y QUICK SORT. c) Algoritmos de selección: En este tipo de algoritmos se SELECCIONA o se busca el elemento más pequeño (o más grande) de todo el conjunto de elementos y se coloca en su posición adecuada. Este proceso se repite para el resto de los elementos hasta que todos son analizados. Entre estos algoritmos se encuentra el de SELECCION DIRECTA. d) Algoritmos de enumeración:

Pueden ser: a) Búsqueda secuencial. Se utiliza cuando el contenido del vector no se encuentra o no puede ser ordenado. Consiste en buscar el elemento comparándolo secuencialmente (de ahí su nombre) con cada elemento del arreglo hasta que éste se encuentre, o hasta que se llegue al final del arreglo. La existencia se puede asegurar desde el momento que el elemento es localizado, pero no podemos asegurar la no existencia hasta no haber analizado todos los elementos del arreglo. A continuación se muestra el pseudocódigo del algoritmo: Datos de Entrada: vec: vector en el que se desea buscar el elemento tam: tamaño del vector dato: elemento que se quiere buscar. Variables pos: posición actual en el arreglo pos = 0 Mientras pos < tam: Si vec[pos]== dato devolver verdadero y/o pos, de lo contrario: pos = pos + 1 Fin (Mientras) Devolver falso B) Búsqueda binaria (dicotómica). Se utiliza cuando el vector en el que queremos determinar la existencia o no de un elemento está ordenado, o puede estarlo, este algoritmo reduce el tiempo de búsqueda considerablemente, ya que disminuye exponencialmente con el número de iteraciones. Este algoritmo esta altamente recomendado para buscar en arreglos enormes: En uno de 50.000.000 elementos, tarda 26 iteraciones en ejecutarse[1] , suponiendo que la búsqueda falla, sino, siempre tarda menos en buscarlo. Para implementar este algoritmo se compara el elemento a buscar con un elemento cualquiera del arreglo (normalmente el elemento central), si el valor de éste es mayor que el del elemento buscado se repite el procedimiento en la parte del arreglo que va desde el inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del arreglo que va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada vez más pequeños, hasta que se obtenga un intervalo indivisible, con el elemento buscado como elemento central. Si el elemento no se encuentra dentro de este último entonces se deduce que el elemento buscado no se encuentra en el arreglo. A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento inicial el elemento central del array. Datos de Entrada: vec: vector en el que se desea buscar el elemento tam: tamaño del vector dato: elemento que se quiere buscar. Variables centro: elemento central del intervalo

inf: límite inferior del intervalo sup: límite superior del intervalo inf = 0 sup = tam- Mientras inf <= sup: centro = ((sup + inf) / 2) /* división entera: se trunca la parte decimal */ Si vec[centro] == dato devolver verdadero y/o pos, de lo contrario: Si dato < vec[centro] entonces: sup=centro- En caso contrario: inf=centro+ Fin (Mientras) Devolver Falso Técnica Secuencial Ordenada/Desordenada. La búsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La búsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o termina sin éxito, cuando se determina que no aparece ningún registro con esa llave. Normalmente un archivo secuencial se almacena en bloques, en un orden secuencial simple de los registros. La organización física del archivo en una cinta o disco se corresponde exactamente con la ubicación lógica del archivo. En este caso, el procedimiento para ubicar los nuevos registros en un archivo de pila separado, llamado archivo de registro (log file) o archivo de transacciones. Periódicamente, se realiza una actualización por lotes que mezcla el archivo de registro con el archivo maestro para producir un nuevo archivo en secuencia correcta de claves. Búsqueda secuencial, también se le conoce como búsqueda lineal. Supongamos una colección de registros organizados como una lista lineal. El algoritmo básico de búsqueda secuencial consiste en empezar al inicio de la lista e ir a través de cada registro hasta encontrar la llave indicada (k), o hasta al final de la lista.

Ordenamiento: Una forma de reducir el numero de comparaciones esperadas cuando hay una significativa frecuencia de búsqueda sin éxito es la de ordenar los registros en base al valor de la llave. Esta técnica es útil cuando la lista es una lista de excepciones, tales como una lista de decisiones, en cuyo caso la mayoría de las búsquedas no tendrán éxito. Con este método una búsqueda sin éxito termina cuando se encuentra el primer valor de la llave mayor que el buscado, en lugar de la final de la lista. Desventajas de la técnica. Este método de búsqueda es muy lento, pero si los datos no están en orden es el único método que puede emplearse para hacer las búsquedas. Si los valores de la llave no son únicos, para encontrar todos los registros con una llave particular, se requiere buscar en toda la lista. Si los registros a los que se accede con frecuencia no están al principio del archivo, la cantidad promedio de comparaciones aumenta notablemente dado que se requiere mas tiempo para recuperar dichos registros. Para las aplicaciones interactivas que incluyen peticione s o actualizaciones de registros individuales, los archivos secuenciales ofrecen un rendimiento pobre. Definitivamente, la búsqueda secuencial es el método menos eficiente; porque se basa en comparar el valor que se desea buscar con cada uno de los valores del archivo. Principales Aplicaciones. Los archivos secuenciales son típicamente utilizados en aplicaciones de proceso de lotes Y son óptimos para dichas aplicaciones si se procesan todos los registros. La organización secuencias de archivos es la única que es fácil de usar tanto en disco como en cinta. Un ejemplo claro para utilizar esta técnica de búsqueda es cuando se tiene una base de datos no muy grande en un negocio pequeño donde los registros mas usados son llamados con frecuencia, es aquí donde esta técnica es fuerte, ya que se aplica a un patrón de búsqueda pequeño, sencillo y manejable; es decir como si fuera una descripción, es uno tras otro. Ejemplo: numero de cliente nombre apellido dirección curp void sequential_search(int x[100], int search_num) { int index = 0; while((index < 100) && (search_num != x[index])) { // Loop while the number is not found and while more elements remain. if(x[index] != search_num) { // If current element is not the one for which we are index++; // searching, increment subscript index. } } return(index); }