Sistematización De Contenidos
Básicos De La Carrera
Tema: 2. Matemática Computacional
Mg. Luis Fernando Aguas Bucheli
+593 984015184
@Aguaszoft
Laguas@uisrael.edu.ec
“El mayor enemigo del conocimiento no es la ignorancia,
sino la ilusión del conocimiento”
— Stephen Hawking
Objetivo
1. Aplicar conceptos y técnicas
de matemática, ciencia e
ingeniería obteniendo
resultados que solucionan
problemas de complejidad
mayor, relacionados al
desarrollo, mejora de
procesos, y otros aspectos
del ámbito de la ingeniería
● 2.1 Implementación de
algoritmos y búsqueda
Contenido
ODS
● 4.3 De aquí a 2030, asegurar
el acceso igualitario de todos
los hombres y las mujeres a
una formación técnica,
profesional y superior de
calidad, incluida la enseñanza
universitaria
META
Métodos de Ordenamiento
La ordenación de los datos consiste en disponer o clasificar un
conjunto de datos (o una estructura) en algún determinado
orden con respecto a alguno de sus campos. Orden: Relación
de una cosa con respecto a otra
Aplicaciones
Ordenamiento interno – datos en RAM
Ordenamiento externo – área de datos en el disco
Aumentar las velocidades de acceso en:
Diccionarios deben estar ordenadas
Un directorio de archivo ordenado por nombre o por fecha.
Calendarios
Listas telefónicas
Números de cheques ordenados por cuenta
Transacciones de tarjetas de crédito ordenadas por fecha y monto
Usando los ordenamientos de Java
Los API de Java proveen una clase Arrays con varios métodos
para diferentes tipos de arreglos.
Las clases Collections proveen similares métodos de
ordenamiento.
Los métodos de ordenamiento para arreglos de datos
primitivos se basan en quicksort
Los métodos de ordenamiento para arreglos de objetos y
listas se basan en mergesort
Método Selección – 1/3
Método Selección es un algoritmo relativamente fácil de
entender
Ordenar un arreglo puede hacer varios pasos a través del
arreglo, selecciona el ítem mas pequeño en el arreglo cada vez
y lo ubica al inicio del arreglo.
Método Selección es llamado ordenamiento cuadrático
Numero de comparaciones es O(n2)
Numero de intercambios es O(n)
SelectionSort.java
Método Selección – 2/3
Algoritmo Selección
1. Para pointer=0 a n-2 haga
2. Ubique la posición del ítem más pequeño en el arreglo
3. Intercambie el ítem a la posición pointer
Refinando el algoritmo Selección (paso 2)
1. Inicialice posMin a pointer
2. Para next = pointer +1 a n- 1
3. Si el ítem en next es menor que el ítem en posMin
4. Cambie posMin a next.
Método Selección – 3/3
1. Busque el valor máximo de los n elementos:
2. Intercámbielo con el “ultimo” elemento (i.e., arr[n-1]) :
3. Decremento n en 1 y repita el Paso 1 (while n > 1)
1 13 8 5 2 1 3
n
1 13
8 5 2 1
3
n
1 13
8 5 2 1
3
n
Método Selección
Iteractivo:
public void selectionSort (double arr [ ], int n)
{
while (n > 1)
{
int k, maxPos = 0;
for ( k = 1; k < n; k++)
if (arr [ k ] > arr [ maxPos ] ) maxPos = k;
double temp = arr [ maxPos ];
arr [ maxPos ] = arr[ n-1 ];
arr [ n-1 ] = temp;
n--;
}
}
Método de Burbuja 1/2
Compara los elementos del arreglo adyacente e intercambia
los valores si estos están fuera de orden.
Los valores pequeños van hacia arriba (burbujean) y los
valores grandes van al final.
Método de Burbuja 2/2
Algoritmo
Varias recorridos por el arreglo
Se comparan pares sucesivos de elementos
Si el orden es incremental (o idéntico), no hay cambio
Si el orden es decremental, los elementos se intercambian
Repetir
Fácil de programar, pero ejecuta con lentitud
Análisis de método de burbuja 3/3
Provee un excelente rendimiento en algunos casos y muy
pobre en otros.
Trabaja mejor cuando el arreglo es ordenado inicialmente.
En el peor de los casos el numero de comparaciones O(n2)
En el peor de los casos los intercambios son O(n2)
El mejor caso ocurre cuando el arreglo esta ordenado
O(n) comparaciones
O(1) intercambios
Método de Inserción 1/4
Basado en la técnica usada por los jugadores de cartas para
arreglar una mano de cartas
Jugadores guardan las cartas que tienen en cierto orden
Cuando el jugador toma una nueva carta, el guarda la carta nueva insertándola
en el lugar apropiado.
Inserción Algoritmo 2/4
1. k = 1; guarde los k elementos en orden.
2. Tome el (k+1)-th elemento e insértelo en los primeros
k en el lugar correcto.
3. Incremente k y repita desde el Paso 2 (while k < n)
1 13 8
5 2 1
3
k
1 13 8
5
2 1
3
k
Inserción Algoritmo 3/4
Iterativo:
public void insertionSort (double arr [ ], int n)
{
int k, i;
for (k = 1 ; k < n; k++)
{
double saved = arr [ k ];
for (i = k; i > 0 && arr [ i-1 ] > saved; i--)
arr [ i ] = a[ i - 1 ];
arr [ i ] = saved;
}
}
Comparación de métodos cuadráticos
Ninguno de los algoritmos son buenos para arreglos grandes.
Shellsort: Una mejor Inserción
Shellsort es un tipo de inserción pero con O(n3/2) o mejor
rendimiento
Descubierto por Donald Shell en 1959
Aprovecha divide y conquista para insertar
Antes de ordenar todo el arreglo, ordena muchos pequeños
sub-arreglos usando inserción antes de ordenarlo
completamente.
Shellsort Características
Compara los elementos que están muy aparte, entonces
acerca los elementos, etc. así elimina mucho movimiento de
datos.
Incrementa la secuencia h1 = 1, h2, … hl
Después de una fase j para todos los k A[k] ≤ A[k + hj] – la
entrada esta hj ordenada
hj arreglo ordenado permanece hj arreglado después hj - 1
ordenamiento.
MergeSort
Un merge es un proceso común de datos que es realizado con
dos secuencias de datos con las siguientes características
Ambas secuencias contienen ítems con un método común de comparación
Los objetos e ambas secuencias son ordenadas de acuerdo al método de
comparación
MergeSort Algoritmo
1. Accese al primer ítem de ambas secuencias
2. Mientras no finalice cualquier secuencia
Compare el ítem actual de las dos secuencias, copie el ítem actual pequeño
a la secuencia de salida, y accese al próximo ítem de la secuencia de
entrada donde los ítems fueron copiados.
3. Copie cualquier ítem remanente de la primera secuencia a la secuencia de
salida.
4. Copie cualquier ítem remanente de la segunda secuencia a la secuencia de
salida
MergeSort
1. Divida el arreglo en dos equivalentes
2. Ordene (recursivamente) cada mitad usando Mergesort.
3. Mezcle (merge) las dos partes generadas
5 4 6
3 2 7
1
1 7
6
5 2 4
3
7
6
5
4
1 3
2
Los pequeños están al inicio
3
1
2
Algoritmo HeapSort
Este algoritmo de ordenación está basado en la estructura de
montículo.
Se define montículo de tamaño n como un árbol binario
completo de n nodos, tal que el contenido de cada nodo es
mayor o igual al contenido de su parte.
Quicksort
Desarrollado en 1962 por C. A. R. Hoare
Recursivo
Divide y conquista
Quicksort rearregla un arreglo en dos partes así todos los
elementos en el arreglo izquierdo son menores o iguales que
un valor específico llamado pivote
Quicksort asegura que los elementos en el arreglo derecho
sean mayores que el pivote
El caso promedio para Quicksort es O(n log n)
Quicksort Algoritmo
Sea S el número de elementos a clasificar
1. Si el numero de elementos en S es 0 o 1 pare y vuelva al
caso base
2. Tome un elemento v desde S llamado pivote
3. Divida los elementos restantes (S - {v}) en dos conjuntos
disjuntos:
L = {x IN (S - {v}) Y x ≤ v}
R = {x IN (S - {v}) Y x ≥ v}
4. Regrese el resultado de aplicar quicksort a L seguido por v
y continúe por el resultado aplicando quicksort a R