Anda di halaman 1dari 11

ANALISIS ALGORITMICO Y METODOS

DE ORDENAMIENTO
¿Qué es el análisis algorítmico?
Un algoritmo es una secuencia de pasos lógica para encontrar la solución de un
problema.

Todo algoritmo debe contar con las siguientes características: preciso, definido y finito.
Por Preciso, entenderemos que cada paso del algoritmo tiene una relación con el anterior
y el siguiente; un algoritmo es Definido, cuando se ejecuta más de una vez con los
mismos datos y el resultado es el mismo; y Finito, indica que el algoritmo cuenta con una
serie de pasos definidos o que tiene un fin.

Hablando de estructuras de datos podemos decir que los algoritmos según su función se
dividen en:

- Algoritmos de ordenamiento y

- Algoritmos de búsqueda.

Un algoritmo de ordenamiento, es el que pone los elementos de una lista o vector en una
secuencia (ascendente o descendente) diferente a la entrada, es decir, el resultado de
salida debe ser una permutación (reordenamiento) de la entrada que satisfaga la relación
de orden requerida.

Un algoritmo de búsqueda, es aquel que está diseñado para encontrar la solución de un


problema booleano de existencia o no de un elemento en particular dentro de un conjunto
finito de elementos (estructura de datos), es decir al finalizar el algoritmo este debe decir
si el elemento en cuestión existe o no en ese conjunto, además, en caso de existir, el
algoritmo podría proporcionar la localización del elemento dentro del conjunto.

Orden de un algoritmo
Al orden del algoritmo se lo denota empleando lo que se conoce como Big-O Notation
debido a que se emplea la letra O (mayúscula) como símbolo.

Se puede argumentar que el orden de un algoritmo nos define cuán rápido es. Así un
algoritmo con O(n) será más rápido que otro con O(n^2), por la sencilla razón de que n^2
>= n.
Pero esa visión no es cierta. El orden de un algoritmo no mide su rapidez, aunque nos
permite ordenar los algoritmos del más eficiente al menos eficiente.

Si el orden pretendiese medir cuán rápido es un algoritmo entonces sí que tendría sentido
algo como O(2n) que indicaría que un algoritmo determinado es el doble de lento que otro
con O(n).

El orden no pretende medir cuán rápido es un algoritmo respecto a otro. El orden mide
otra cosa. Mide cuan rápidamente aumenta el tiempo de ejecución de un algoritmo
cuando aumenten los datos de entrada. Tomemos como ejemplo un algoritmo cualquiera,
por ejemplo, uno para ordenar listas.

Si tiene O(n) significa que el tiempo aumenta linealmente al aumentar los datos de
entrada. Es decir, que si para una lista de 100 elementos el algoritmo tarda x segundos,
para una lista de 1000 elementos (10 veces más grande) tardará 10 veces más. Es, en
definitiva, lo que nos dice el sentido común: si te doblo el tamaño de entrada, debes tardar
el doble. Lógico, ¿no? De hecho, el orden lineal es una característica deseable de
cualquier algoritmo.

Pero podemos tener dos algoritmos distintos para ordenar listas, ambos de O(n) y uno
mucho más rápido que otro. Pero ambos aumentarán linealmente su tiempo de ejecución
al aumentar el tamaño de los datos de entrada.

Por otro lado si el algoritmo tiene O(n^2) significa que el tiempo aumenta
cuadráticamente. No quieras tener algoritmos como esos: en este caso si para ordenar
una lista de 100 elementos el algoritmo tarda x segundos, para una lista de 1000
elementos tardará 100 veces más. Es decir, hemos aumentado los datos de entrada en
un radio de 10 y el algoritmo no tarda 10 veces más si no 100 (10^2). Si se debe lidiar con
uno de esos se debe tener en cuenta que hay inclusive peores, como los que tienen orden
polinomial (O(n^a) donde a es mayor que 2), todavía peores de orden exponencial
(O(a^n) donde a es mayor que 1) y quizá los peores de todos, los de orden factorial
(O(n!)).

Pero existen unos algoritmos que desafían al sentido común y son una muchos más
prácticos: en estos el tiempo aumenta logarítmicamente. Es decir, si para ordenar una
lista de 100 elementos el algoritmo tarda x segundos, para ordenar una lista 10 veces más
larga tardará tan solo el doble. Esos son los que tienen un orden O(log n) y los que, por
supuesto, se intentan encontrar en cualquier caso.

Por norma general, siempre que sea posible debemos usar un algoritmo del menor orden
posible. Es decir si tenemos dos algoritmos que hacen lo mismo y uno es de O(n) y el otro
es O(n^2) mejor usamos el primero, ya que nos protege mejor contra volúmenes de datos
grandes, aunque todo depende, porque si sabemos que nuestros datos nunca van a
crecer por encima de un determinado umbral, quizá nos interese usar uno de orden mayor
pero que sea más rápido (aunque el orden nos dice que se volvería más lento a partir de
cierto tamaño de los datos de entrada).
Por último mencionar que el orden se suele aplicar al tiempo de ejecución, pero puede
aplicarse a otros aspectos (por ejemplo, la memoria que consume un determinado
algoritmo).

Casos mejor, peor y promedio


En análisis de algoritmos, los términos caso peor, caso mejor y caso promedio tienen los
siguientes significados:

Caso mejor: se refiere a la situación inicial de los datos que genera una ejecución del
algoritmo con una menor complejidad computacional.

Caso peor: se refiere a la situación inicial de los datos que genera una ejecución del
algoritmo con una complejidad computacional mayor.

Caso promedio: la situación inicial de los datos no sigue ningún patrón preestablecido que
aporte ventajas o desventajas. Se puede considerar, por tanto, la situación típica de
ejecución del algoritmo.

En el caso de los algoritmos de ordenamiento o clasificación, la complejidad


computacional está determinada por el número de comparaciones y de asignaciones
entre elementos del conjunto que se realiza en una implementación específica
del algoritmo.

Por ejemplo, en el algoritmo de Inserción directa el caso mejor se presenta cuando el


conjunto de elementos a ordenar se encuentra ya ordenado. En ese caso, los valores
representativos son los siguientes:

Donde Cmin y Mmin son el número mínimo de comparaciones y el número mínimo de


movimientos entre elementos del conjunto de datos del algoritmo de Inserción directa.
Métodos de ordenamiento
METODOS DE ORDENAMIENTO LINEAL

BubleSort (Burbuja mejorado)


La idea de este método es ir tomando los elementos de a dos e ir comparándolos e
intercambiándolos de ser necesario, hasta que todos los elementos sean comparados.

El bucle externo establece un desplazamiento


secuencial dentro del vector desde el primer elemento
hasta el penúltimo, el bucle interno realiza un recorrido
del vector desde el elemento i+1 hasta el último
elemento del vector y va reduciendo en cada iteración
del bucle externo el número de elementos a comparar,
ya que los elementos anteriores ya debieron ordenarse
en las iteraciones anteriores. Ahora bien, lo que se
quiere es ordenar todos los valores, para lo cual se
compara el elemento i con los subsiguientes elementos del vector e intercambiándolo
cuando sea mayor que alguno de los elementos ubicado en alguna posición inferior del
vector, en este intercambio es que se genera la burbuja, donde los elementos más
pequeños van subiendo y los más grandes se van ubicando en las posiciones inferiores
del vector.

Análisis del algoritmo.

 Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo
tanto es estable.
 Requerimientos de Memoria: Este algoritmo sólo requiere de una variable
adicional para realizar los intercambios sin importar qué tan grande sea el vector.
Requerimiento constante.
 Tiempo de Ejecución: El ciclo interno se ejecuta (n-1)*n/2 veces para una lista de n
elementos. El ciclo externo se ejecuta n veces. Es decir, la complejidad es n * n =
O(n2). El comportamiento del caso promedio depende del orden de entrada de los
datos, pero es sólo un poco mejor que el del peor caso, y sigue siendo O(n2).

Ventajas Desventajas
Fácil implementación Muy lento
No requiere memoria adicional. Realiza numerosas comparaciones
Realiza numerosos intercambios.
InsertionSort (Método de la baraja)
En este procedimiento se recurre a una búsqueda binaria en lugar de una búsqueda
secuencial para insertar un elemento en la parte de arriba del arreglo, que ya se
encuentra ordenado. El proceso, al igual que en el método de inserción directa, se repite
desde el segundo hasta el n-ésimo elemento.

Análisis del algoritmo.

 Estabilidad: Este algoritmo nunca


intercambia registros con claves iguales. Por lo
tanto es estable.
 Requerimientos de Memoria: Este algoritmo
sólo requiere de una variable adicional para realizar
los intercambios sin importar qué tan grande sea el
vector. Requerimiento constante.
 Tiempo de Ejecución: Al analizar el método
de ordenación por inserción binaria se advierte la
presencia de un caso antinatural. El método efectúa
el menor número de comparaciones cuando el
arreglo está totalmente desordenado y el máximo
cuando está ordenado.

Es posible suponer que mientras en una búsqueda secuencial se necesitan k


comparaciones para insertar un elemento, en una búsqueda binaria se necesitará la mitad
de las k comparaciones. Por lo tanto, el número de comparaciones promedio en el método
de ordenación por Inserción Binaria puede calcularse como :

C= (1/2) + (2/2) + (3/2) + . . . + ((n-1)/2) = ((n(n-1))/4) = ((n2 – n) / 4)

Éste es un algoritmo de comportamiento antinatural y por lo tanto es necesario ser muy


cuidadoso cuando se hace un análisis de él. Las mejoras producen un efecto negativo
cuando el arreglo está ordenado y produce resultados apenas satisfactorios cuando las
claves (temp y V[Medio]) están desordenadas. De todas maneras debe recordarse que no
se reduce el número de movimientos que es una operación más complicada y costosa
que la operación de comparación. Por lo tanto, el tiempo de ejecución del algoritmo sigue
siendo proporcional a n2.

Ventajas Desventajas
Fácil implementación Lento.
No requiere memoria adicional. En promedio hace numerosas
comparaciones.
SelectionSort (Método Sencillo)
Entre los métodos elementales de ordenación de vectores se encuentra el algoritmo de
selección:

Es decir, el método se basa en buscar en cada interacción el mínimo elemento del


“subvector” situado entre el índice i y el final del vector e intercambiarlo con el de índice i.
Tomando la dimensión del vector n como tamaño del problema es inmediato que el bucle
se repite n veces y por tanto la función que da el número de repeticiones es de tipo lineal
(O(n)). La operación interior al bucle se puede desarrollar a su vez como:

Se trata de una secuencia de tres operaciones, la segunda de las cuales es, a su vez, una
iteración. La primera (asignación) y la tercera(intercambio) pueden considerarse de coste
constante. La segunda es un bucle que internamente incluye una operación condicional
que en el peor caso supone una operación de coste constante (O(1)) (en el peor caso y
en el mejor, puesto que la comparación se ha de realizar siempre ) y el número de
repeticiones de esa operación es de tipo lineal, ya que se realiza n-(i+1) veces, y por
tanto, al crecer n, el número de veces crece proporcionalmente a n. Luego será de
costeO(n) O(1) = O(n). Éste será entonces el coste de la secuencia completa (sucesión de
dos operaciones de coste constante y una de coste lineal)

El algoritmo total será entonces de ordenO(n).O(n) =O(n^2)

Es interesante observar que en este algoritmo el contenido de los datos de entrada, no


influye en el coste del algoritmo. En efecto se puede comprobar (aplicar el algoritmo sobre
varios vectores ejemplo), que se ejecutan de forma completa ambos bucles tanto para
vector desordenado como para vector ordenado.
Análisis del algoritmo.

 Estabilidad: No es estable. Intercambia registros con claves iguales.


 Requerimientos de Memoria: Este algoritmo sólo requiere de una variable
adicional para realizar los intercambios sin importar qué tan grande sea el vector.
Requerimiento constante.
 Tiempo de Ejecución: El ciclo externo se ejecuta n veces para una lista de n
elementos. Cada búsqueda requiere comparar todos los elementos no
clasificados. Luego la complejidad es O(n2). Este algoritmo presenta un
comportamiento constante independiente del orden de los datos. Luego la
complejidad promedio es también O(n2).

Ventajas Desventajas
Fácil implementación Lento
No requiere memoria adicional. Realiza numerosas comparaciones.
Realiza pocos intercambios. Este es un algoritmo lento
Rendimiento constante: poca diferencia
entre el peor y el mejor caso

No obstante, ya que sólo realiza un intercambio en cada ejecución del ciclo externo,
puede ser una buena opción para listas con registros grandes y claves pequeñas.

METODOS DE ORDENAMIENTO RECURSIVOS

Primero debemos decir que la recursividad no es una estructura de datos, sino


que es una técnica de programación que nos permite que un bloque de
instrucciones se ejecute n veces. Remplaza en ocasiones a estructuras repetitivas.

void repetir() {

repetir();

La función repetir es recursiva porque dentro de la función se llama a sí misma.

QuickSort (Rápido)
La ordenación rápida, inventada y nombrada por C.A.R. Hoare en 1960, está considerada
como el mejor algoritmo de ordenación disponible actualmente. Está basada en la
ordenación por el método de intercambio.

La ordenación rápida se basa en la idea de las particiones. El procedimiento general es


seleccionar un valor llamado COMPARANDO y entonces dividir el array en dos partes. En
un lado todos los elementos mayores o iguales al valor de partición y en otro todos los
elementos menores que el valor. Este proceso se repite en cada parte restante hasta que
el array esté ordenado.
Como se puede ver, este proceso es esencialmente recursivo por naturaleza y, de hecho,
las implementaciones más claras de la ordenación rápida es por algoritmos recursivos.

La selección del valor comparado se puede obtener de dos formas. Se puede seleccionar
aleatoriamente o haciendo la media de un pequeño conjunto de valores tomados del
array. Para una ordenación optima es mejor seleccionar un valor que este precisamente
en medio del rango de valores. Sin embargo, esto no es fácil de hacer en la mayoría de
los conjuntos de datos. En el caso peor, el valor escogido esta en un extremo. Incluso en
este, la ordenación rápida todavía funciona bien. La versión de la ordenación rápida que
sigue selecciona el elemento mitad del array. Aunque no siempre será una buena
elección, la ordenación sigue funcionando correctamente.

 Estabilidad: No es estable.
 Requerimientos de Memoria: No requiere memoria adicional en su forma
recursiva.
 Tiempo de Ejecución:
o Caso promedio. La complejidad para dividir una lista de n es O(n). Cada
sublista genera en promedio dos sublistas más de largo n/2. Por lo tanto la
complejidad se define en forma recurrente como:
 f(1) = 1
 f(n) = n + 2 f(n/2)
 La forma cerrada de esta expresión es: f(n) = n log2n Es decir, la
complejidad es O(n log2n).
o El peor caso ocurre cuando la lista ya está ordenada, porque cada llamada
genera sólo una sublista (todos los elementos son menores que el
elemento de división). En este caso el rendimiento se degrada a O(n2). Con
las optimizaciones mencionadas arriba puede evitarse este
comportamiento.

Ventajas Desventajas
Generalmente es el más rápido Implementación un poco más
complicada
No requiere memoria adicional Mucha diferencia entre el peor
(n2) y el mejor caso (log n)

MergeSort (Por Mezcla)


El algoritmo Merge divide el
arreglo original en dos arreglos
y los coloca en arreglos
separados. Cada arreglo es
recursivamente ordenado y
finalmente se unen los
arreglos en un arreglo
ordenado. Como cualquiera de
los algoritmos de
ordenamiento recursivo el
algoritmo Merge tiene
complejidad de O(n log n). Fue
desarrollado por John Von
Neumann.

Este método aplica la técnica


divide-y-vencerás, dividiendo
la secuencia de datos en dos
subsecuencias hasta que las
subsecuencias tengan un
único elemento, luego se
ordenan mezclando dos
subsecuencias ordenadas en
una secuencia ordenada, en
forma sucesiva hasta obtener
una secuencia única ya
ordenada. Si n = 1 solo hay un
elemento por ordenar, sino se
hace una ordenación de
mezcla de la primera mitad del arreglo con la segunda mitad. Las dos mitades se ordenan
de igual forma. Ejemplo: Se tiene un arreglo de 8 elementos, se ordenan los 4 elementos
de cada arreglo y luego se mezclan. El arreglo de 4 elementos, se ordenan los 2
elementos de cada arreglo y luego se mezclan. El arreglo de 2 elementos, como cada
arreglo sólo tiene n = 1 elemento, solo se mezclan.

En la cultura popular, divide y vencerás hace referencia a un refrán que implica resolver un
problema difícil, dividiéndolo en partes más simples tantas veces como sea necesario, hasta
que la resolución de las partes se torna obvia. La solución del problema principal se construye
con las soluciones encontradas.

En las ciencias de la computación, el término divide y vencerás (DYV) hace referencia a uno
de los más importantes paradigmas de diseño algorítmico. El método está basado en la
resolución recursiva de un problema dividiéndolo en dos o más subproblemas de igual tipo o
similar. El proceso continúa hasta que éstos llegan a ser lo suficientemente sencillos como
para que se resuelvan directamente. Al final, las soluciones a cada uno de los subproblemas
se combinan para dar una solución al problema original

Esquema procedimiento Algoritmo MergeSort:

Análisis del algoritmo.

 Estabilidad: Sí es estable.
 Requerimientos de Memoria: Se necesita memoria auxiliar del mismo tamaño de
los conjuntos a mezclar.
 Tiempo de Ejecución: O(n log n).
Ventajas Desventajas
Rápido Implementación compleja.
Especial para datos atómicos o Grandes Requerimientos de Memoria
registros con pocos componentes

Datos del grupo:


Departamento: SISTEMAS.

Cátedra: Algoritmos y Estructura de Datos.

Ciclo 2015 / 2016

ALUMNO: OSATINSKY, AGUSTIN - LEGAJO: 43708 - DNI: 40089677.

ALUMNO: NACCHIO, GINO - LEGAJO: 43702 - DNI: 38117269.

ALUMNO: NAVARRO BORDON, MATIAS - LEGAJO: 43704 - DNI: 39975676.

COMISION: 1K5.

PROFESOR DE PRACTICA: CANTO, JAVIER.

PROFESOR DE TEORIA: MONTESINOS, LEONARDO RAFAEL.

Bibliografía
 http://geeks.ms/blogs/etomas/archive/2012/11/28/el-orden-de-los-algoritmos-esa-gran-
o.aspx
 https://sites.google.com/site/estdatjiq/home/unidad-vii
 http://artemisa.unicauca.edu.co/~nediaz/EDDI/cap03.htm
 https://es.wikipedia.org/wiki/Casos_peor,_mejor_y_promedio
 http://www.javaya.com.ar/detalleconcepto.php?codigo=123&inicio=40

Anda mungkin juga menyukai