Portada arrow Algoritmos
Algoritmos

En esta sección encontrarás una colección de algoritmos y recetas algorítmicas que a veces pueden resultar de utilidad.

En la categoría con nombre propio hablamos de algoritmos a los cuales nos referimos por su nombre o el nombre de sus creadores y en la categoría de recetas algorítmicas, de formulas sencillas y algoritmos de importancia menor que no tienen un nombre concreto. En la categoría trivialidades hablamos de cosas muy simples.



Ordenación por el método de Shell (ShellSort)
Con nombre propio
domingo, 31 de agosto de 2008

Siempre me ha fascinado el algoritmo de ordenacion de Shell. Debe su nombre al ingeniero y matemático estadounidense Donald Shell External link, que lo publicó en la revista Communications of the ACM External link en 1959.

Es un algoritmo de ordenación interna muy sencillo pero muy ingenioso, basado en comparaciones e intercambios, y con unos resultados radicalmente mejores que los que se pueden obtener con el método de la burbuja, el de selección directa o el de inserción directa.

Aunque a menudo, es un algoritmo un tanto olvidado por dos motivos: en primer lugar, en los cursos básicos de programación se suele pasar por alto o se pasa "de puntillas" por este algoritmo, dado que su comprensión requiere un cierto esfuerzo y algo de tiempo, y se suele centrar la atención en los tres algoritmos más básicos (burbuja, selección e inserción); y en segundo lugar, el algoritmo QuickSort, desarrollado por Hoare en 1962 puede dar mejores resultados aún que éste, con lo cual, le suele hacer bastante sombra en los temarios de los cursos de programación básicos.

Sin embargo, es necesario romper una lanza a favor del algoritmo ShellSort, ya que es el mejor algoritmo de ordenación in-situ... es decir, el mejor de aquellos en los que la cantidad de memoria adicional que necesita -aparte de los propios datos a ordenar, claro está- es constante, sea cual sea la cantidad de datos a ordenar. El algortimo de la burbuja, el de selección directa, el de inserción directa y el de Shell son todos in-situ, y éste último, el de Shell, es el que mejor resultados da, sin ninguna duda de todos ellos y sus posibles variantes.

Por supuesto que otros métodos de ordenación, como QuickSort, BinSort, HeapSort o RadixSort pueden pueden superar a ShellSort en cuanto al tiempo de ejecución, pero ninguno de ellos es ya un algoritmo in-situ. En todos ellos es necesario gestionar una cantidad adicional de memoria proporcional al tamaño de los datos a ordenar... pero de ellos hablaremos en otros artículos.

En este artículo nos centraremos en ShellSort. Describiremos la idea que subyace detrás del algoritmo, la k-ordenación, e intentaremos llegar de manera intuitiva al código del algorimo. Finalmente, intentaremos hablar de alguna simplificación y optimización del algoritmo. Todo ello, sin meternos en el berenjenal de demostrar su corrección.

Intentaremos que en la medida de lo posible no sea demasiado pesado, utilizando ejemplos y animaciones.

 

Leer más...
 
Búsqueda lineal en arrays
Trivialidades
domingo, 24 de febrero de 2008

El algoritmo de búsqueda lineal es uno de los más utilizados en situaciones bastante comunes. Es también uno de los algoritmos más sencillos e intuitivos.

Sin embargo, resulta curioso comprobar cómo en gran cantidad de aplicaciones, muchas de ellas de ámbito altamente «profesional» se perpetran extrañas implementaciones que en algunos casos conllevan manifiestas ineficiencias y en otros peligros de salirse de los límites de los datos, por no hablar de situaciones en las que la programación estructurada se deja de lado.

En éste artículo vamos a reflexionar acerca de la búsqueda lineal y de sus posibles implementaciones defendiendo la bondad o no de cada una de ellas.

Leer más...
 
Divisores de un entero y la función divisor
Recetas algorítmicas
domingo, 13 de enero de 2008

Cuando dividimos un número entero entre otro, lo podemos hacer de dos formas: mediante una división exacta o mediante una división entera o euclidea.

El resultado de la división exacta de dos enteros es, con carácter general, un número real... (mejor dicho, racional) y el resultado de una división euclidea es otro entero. Si tengo que repartir 7 manzanas entre 2 personas, tocan a 3.5 manzanas cada una si realizo una división exacta, y si no puedo o no quiero partir una manzana, tendré que repartilas por unidades enteras (división entera o euclidea): tocan a 3 cada persona (cociente entero) y sobra una (resto).

Considerando sólo la división entera, decimos que un número entero k es divisor de otro entero n si existe un tercer entero a tal que n=k·a. Dicho de otro modo, al dividir de manera entera el número n entre k, el resto es 0. En matemáticas suelen expresar esta relación entre un número n y uno de sus divisores k como k|n y se suele leer "k divide a n" o "k es divisor de n", aunque también puede interpretarse como que "n es múltiplo de k". A los divisores de un número n también se les suele llamar factores propios o divisores propios pero de esta denominación queda excluido el propio número n.

Los divisores de un número entero han sido objeto de estudio de múltiples matemáticos a lo largo de la historia -podemos remontarnos hasta el propio Euclides External link, y es probable que no fuera el primero-. Siempre se han buscado en los números enteros propiedades y cualidades que fueran prácticas, curiosas o incluso mágicas. En la actualidad, este estudio forma parte de teoría elemental de números External link.

En este artículo vamos a intentar implementar un par de algoritmos sencillos para obtener todos los divisores de un número, y hablaremos de alguna que otra cosa más con relación a ellos.

Leer más...
 
Escribir números con letras
Recetas algorítmicas
lunes, 19 de noviembre de 2007

Con éste escueto título pretendemos presentar un algoritmo tal que dada una cantidad numérica entera y positiva sea capaz de expresarla con texto, es decir, tal y como la leemos.

Este tipo de algoritmos se utiliza, por ejemplo, en la emisión de cheques bancarios y otros documentos en los que se escriben cifras como método adicional para evitar errores y/o falsificaciones. También se utilizan en aplicaciones de síntesis de voz, en los cuales puede ser necesario "leer" las cifras.

En principio, no es un algoritmo complicado, ya que el sistema que utilizamos para leer las cifras está basado en dar nombre a las unidades, decenas y centenas (con lo que podemos leer los nombres de cualquier números de tres cifras) y a partir de ahí utilizar agrupaciones de tres en tres (miles) y de seis en seis (millones, billones, etc...). Es decir, podemos encontrar una estructura regular en la forma de leer los números.

Sin embargo, hacerlo relativamente bien en español no es tan sencillo (comparado con idiomas como el inglés, por ejemplo), ya que por un lado se utiliza una enorme cantidad de irregularidades (por ejemplo, números con nombre propio, como el doce, que si tuviera un nombre regular debería llamarse diez y dos" y de estos tenemos un montón -del once al veintinueve-) y por otro lado, el hecho de que en español los números pueden actuar tanto de pronombre como de determinante, y en éste último caso, tanto femenino como masculino (Ejemplo: 761 puede actuar como pronombre: "Setecientos sesenta y uno", como determinante masculino: "Setecientos sesenta y un euros", o femenino: "Setecientas sesenta y una libras esterlinas").

 

Leer más...
 
Ordenación por inserción directa (InsertionSort)
Con nombre propio
sábado, 10 de noviembre de 2007

El algoritmo de ordenación por el método de inserción directa es un algoritmo relativamente sencillo y se comporta razonablemente bien en gran cantidad de situaciones.

Completa la tripleta de los algoritmos de ordenación más básicos y de orden de complejidad cuadrático, junto con SelectionSort y BubbleSort.

Se basa en intentar construir una lista ordenada en el interior del array a ordenar.

De estos tres algoritmos es el que mejor resultado da a efectos prácticos. Realiza una cantidad de comparaciones bastante equilibrada con respecto a los intercambios, y tiene un par de características que lo hacen aventajar a los otros dos en la mayor parte de las situaciones.

 

Leer más...
 

Categorías

Artículos relacionados

¿Quién está en línea?

 web tracker

Licencia Creative Commons Powered by Joomla! CMS Terminos de uso y formulario de contacto BloGalaxia

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)