Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Asignatura
TECNOLOGIA DE PROGRAMACION
2º Curso
Profesor:
Hakim Pergentino ESIMI MBOMIO ANGUÉ
ING. DE SISTEMAS
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 3 de 91
PARTE I:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 4 de 91
INTRODUCCIÓN.
Empezaremos con unas definiciones un poco técnicas, pero que son
imprescindibles para el aprendizaje.
TECNOLOGÍA:
Dentro del campo que nos interesa a nosotros, la tecnología tiene el
objetivo de eliminar las tareas repetitivas, facilitando el trabajo y
haciéndolo más eficiente así como aumentando la productividad y los
beneficios de la empresa.
la tecnologia aunque tenga varias definiciones, la definimos como un
conjunto de los conocimientos, instrumentos y metodos tecnicos
empleados en un sector profesional.
Programación:
La programación es una de las etapas más importantes del ciclo de vida
de un proyecto (explicaremos más adelante lo que es este término), y
requiere un método de trabajo. La programación es el resultado de dicho
trabajo.
La programación es el instrumento que permite la ejecución de las
tareas automatizadas de un sistema informático.
Las herramientas que utilizaremos para programar son los lenguajes de
programación, a través de las cuales codificaremos los programas.
Programa:
Conjunto de instrucciones entendibles por el ordenador que permiten
realizar un trabajo o resolver un problema.
Un programa debe ser finito, es decir, tiene que tener un inicio y un
fin. Tiene que estar bien confeccionado para que, al introducir un
dato, salga una solución y si se volviese a introducir el mismo dato,
saliese de nuevo la misma solución.
Metodología de la programación:
Se entiende como metodología de la programación al conjunto de normas,
métodos y anotaciones que nos indican la forma de programar.
Cada lenguaje de programación sigue una metodología distinta.
Lenguaje de programación:
Es un conjunto de reglas semánticas así como sintácticas que los
programadores usan para la codificación de instrucciones de un programa
o algoritmo de programación.
Existen varios lenguajes de programación.
Recursos:
Conjunto de componentes hardware que utilizaremos para la elaboración
de un programa (cpu, disco duro, etc.).
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 5 de 91
TEMA 1:CONCEPTOS BÁSICOS Y ANÁLISIS ASINTÓTICO DE ALGORITMOS.
1.1 ALGORITMO. ¿Qué es?
Definición 1.1.1 (Algoritmo) Descripción no ambigua y precisa de una
secuencia de accionesque permite resolver un problema bien definido en
tiempo finito.
Por lo tanto, básicamente un algoritmo es la descripción de cómo
resolver el problema; pero,además, en la definición aparecen una serie
de calificativos que nos indican qué características se están
imponiendo a esta descripción:
No ambigua: Cada acción debe tener una única interpretación.
Precisa: Cada acción debe estar definida rigurosamente.
Como consecuencia de estas dos premisas se tiene que el lenguaje
natural no es un lenguajeapropiado para definir algoritmos, ya que
puede dar lugar a interpretaciones según el oyente.
Secuencia: No se refiere sólo a una sucesión más o menos larga de
instrucciones: el orden que ocupa una instrucción en esa secuencia es
significativo.
Problema bien definido: Debe conocerse de qué datos se va disponer y
cuáles son los resultados esperados.
Además, se ha de tener en cuenta que un buen algoritmo debe ser un
método general para resolver todos los casos posibles del mismo
problema.
Tiempo finito: Los algoritmos deben finalizar.
Relacionados con el concepto de algoritmo, se tienen los siguientes:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 6 de 91
Definición 1.1.5 (Procesador) La entidad que puede comprender y
ejecutar de forma eficaz unalgoritmo.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 7 de 91
Definición 1.2.1 (Programa) Es la codificación de un algoritmo en un
lenguaje de programación.
Una vez que se diseñado el algoritmo, la traducción de este a un
lenguaje de programación para obtener un programa es muy directa. Basta
con conocer el lenguaje de programación a utilizar y disponer de un
procesador del lenguaje que permita generar el código ejecutable por el
computador.
Como ya se ha hecho antes, se puede establecer una analogía entre el
esfuerzo intelectual de escribir una novela y el de escribir un
algoritmo; la generación del programa a partir del algoritmo sería
equivalente al esfuerzo de traducir una novela a otro idioma.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 9 de 91
PRECISO: indica exactamente el orden de realización de las
instrucciones.
6. Sacar la rueda
7. Colocar la rueda de Repuesto
8. Colocar las tuercas
9. Apretar las tuercas
10. Guardar las herramientas
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 10 de 91
Estudio detallado Documentos de Especificación
Algoritmo PRUEBA
Inicio
Variables
A,B,C: entero
Leer(A,B)
C A+B
Escribir
(C)
Fin
Algoritmo Sumar
Inicio
Variables
A,B,C: entero
Leer(A,B)
C A+B
Escribir (C)
Fin
Programa escritoen un Lenguaje de Programación
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 11 de 91
Programa Ejecutable Aplicación
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 12 de 91
Un tipo de datos abstracto (TDA) es un tipo de datos definido de forma
única mediante un conjunto dado de operaciones definidas sobre este
tipo.Una estructura de datos es una implementación física de un tipo de
datos abstracto. El diseño de una estructura de datos se realiza en
tres fases:
Análisis de datos y operaciones
Elección de TDA (tipo de datos abstractos)
Elección de una implementación
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 13 de 91
TDA conjunto:No es estructurado ya que no está organizado el modo de
acceso a sus componentes, mientras que el arreglo y el registro si lo
son.
Tipo TDA lista (o secuencia):colección homogénea de datos, ordenados
según su posición tal que cada elemento tiene un predecesor (excepto el
primero) y un único sucesor (excepto el ultimo). Las operaciones
asociadas son:
Insertar(inserta un elemento x en la posición p de la lista)
Localizar(localiza la posición p en la que se encuentra el dato x)
Recuperar (encuentra l elemento x que está en la posición p)
Suprimir (elimina de la lista el elemento de la posición p)
suprimirData (elimina de la lista cualquier aparición de elemento x)
anula (ocasiona que la lista se vacíe la lista)
primero (fin) proporciona el primer elemento de la lista
imprimir, imprime todos los elementos de la lista en su orden.
Los algoritmos de complejidad O(n) y O(n log n) son los que muestran un
comportamiento más "natural": prácticamente a doble de tiempo, doble de
datos procesables.
Los algoritmos de complejidad logarítmica son un descubrimiento
fenomenal, pues en el doble de tiempo permiten atacar problemas
notablemente mayores, y para resolver un problema el doble de grande
sólo hace falta un poco más de tiempo (ni mucho menos el doble).
Los algoritmos de tipo polinómico no son una maravilla, y se enfrentan
con dificultad a problemas de tamaño creciente. La práctica viene a
decirnos que son el límite de lo "tratable".
Sobre la tratabilidad de los algoritmos de complejidad polinómica
habría mucho que hablar, y a veces semejante calificativo es puro
eufemismo. Mientras complejidades del orden O(n2) y O(n3) suelen ser
efectivamente abordables, prácticamente nadie acepta algoritmos de
orden O(n100), por muy polinómicos que sean. La frontera es imprecisa.
Cualquier algoritmo por encima de una complejidad polinómica se dice
"intratable" y sólo será aplicable a problemas ridículamente pequeños.A
la vista de lo anterior se comprende que los programadores busquen
algoritmos de complejidad lineal. Es un golpe de suerte encontrar algo
de complejidad logarítmica. Si se encuentran soluciones polinomiales,
se puede vivir con ellas; pero ante soluciones de complejidad
exponencial, más vale seguir buscando.
No obstante lo anterior ...
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 16 de 91
... si un programa se va a ejecutar muy pocas veces, los costes de
codificación y depuración son los que más importan, relegando la
complejidad a un papel secundario.
... si a un programa se le prevé larga vida, hay que pensar que le
tocará mantenerlo a otra persona y, por tanto, conviene tener en cuenta
su legibilidad, incluso a costa de la complejidad de los algoritmos
empleados.
... si podemos garantizar que un programa sólo va a trabajar sobre
datos pequeños (valores bajos de N), el orden de complejidad del
algoritmo que usemos suele ser irrelevante, pudiendo llegar a ser
incluso contraproducente.
Por ejemplo, si disponemos de dos algoritmos para el mismo problema,
con tiempos de ejecución respectivos:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 18 de 91
las sentencias de un algoritmo requieren un tiempo constante de
ejecución, siendo su complejidad O(1).
1.11.2 SECUENCIA(;)
La complejidad de una serie de elementos de un programa es del orden de
la suma de las complejidades individuales, aplicándose las operaciones
arriba expuestas.
1.11.4 BUCLES
En los bucles con contador explícito, podemos distinguir dos casos, que
el tamaño N forme parte de los límites o que no. Si el bucle se realiza
un número fijo de veces, independiente de N, entonces la repetición
sólo introduce una constante multiplicativa que puede absorberse.
Ejemplo:
for (int i= 0; i< K; i++) { algo_de_O(1) } => K*O(1) = O(1)
Si el tamaño N aparece como límite de iteraciones ...
Ejemplo:
for (int i= 0; i < N; i++) { algo_de_O(1) } => N * O(1) = O(n)
Ejemplo:
for (int i= 0; i < N; i++) {
for (int j= 0; j < N; j++) {
algo_de_O(1)
}
}
tendremos N * N * O(1) = O(n2)
Ejemplo:
for (int i= 0; i < N; i++) {
for (int j= 0; j < i; j++) {
algo_de_O(1)
}
}
el bucle exterior se realiza N veces, mientras que el interior se
realiza 1, 2, 3, ... N veces respectivamente. En total,
1 + 2 + 3 + ... + N = N*(1+N)/2 -> O(n2)
class Polinomio {
private double[] coeficientes;
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 20 de 91
double evalua_2 (double x) {
double resultado= 0.0;
for (int termino= 0; termino < coeficientes.length; termino++) {
resultado+= coeficientes[termino] * potencia(x, termino);
}
return resultado;
}
private double potencia (double x, int n) {
if (n == 0)
return 1.0;
// si es potencia impar ...
if (n%2 == 1)
return x * potencia(x, n-1);
// si es potencia par ...
double t= potencia(x, n/2);
return t*t;
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 21 de 91
double evalua_4 (double x) {
double resultado= 0.0;
for (int termino= coeficientes.length-1; termino >= 0; termino--)
{
resultado= resultado * x +
coeficientes[termino];
}
return resultado;
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 22 de 91
heurísticos para obtener soluciones hipotéticas que se van desestimando
(o aceptando) a ritmo polinómico. Los problemas de esta clase se
denominan NP (la N de no-deterministas y la P de polinómicos).
Clase NP-completos.-
Se conoce una amplia variedad de problemas de tipo NP, de los cuales
destacan algunos de ellos de extrema complejidad. Gráficamente podemos
decir que algunos problemas se hayan en la "frontera externa" de la
clase NP. Son problemas NP, y son los peores problemas posibles de
clase NP. Estos problemas se caracterizan por ser todos "iguales" en el
sentido de que si se descubriera una solución P para alguno de ellos,
esta solución sería fácilmente aplicable a todos ellos. Actualmente hay
un premio de prestigio equivalente al Nobel reservado para el que
descubra semejante solución ... ¡y se duda seriamente de que alguien lo
consiga!
Es más, si se descubriera una solución para los problemas NP-completos,
esta sería aplicable a todos los problemas NP y, por tanto, la clase NP
desaparecería del mundo científico al carecerse de problemas de ese
tipo. Realmente, tras años de búsqueda exhaustiva de dicha solución, es
hecho ampliamente aceptado que no debe existir, aunque nadie ha
demostrado, todavía, la imposibilidad de su existencia.
1.11.9 CONCLUSIONES.
Antes de realizar un programa conviene elegir un buen algoritmo, donde
por bueno entendemos que utilice pocos recursos, siendo usualmente los
más importantes el tiempo que lleve ejecutarse y la cantidad de espacio
en memoria que requiera. Es engañoso pensar que todos los algoritmos
son "más o menos iguales" y confiar en nuestra habilidad como
programadores para convertir un mal algoritmo en un producto eficaz. Es
asimismo engañoso confiar en la creciente potencia de las máquinas y el
abaratamiento de las mismas como remedio de todos los problemas que
puedan aparecer.
En el análisis de algoritmos se considera usualmente el caso peor, si
bien a veces conviene analizar igualmente el caso mejor y hacer alguna
estimación sobre un caso promedio. Para independizarse de factores
coyunturales tales como el lenguaje de programación, la habilidad del
codificador, la máquina soporte, etc. se suele trabajar con un cálculo
asintótico que indica cómo se comporta el algoritmo para datos muy
grandes y salvo algún coeficiente multiplicativo. Para problemas
pequeños es cierto que casi todos los algoritmos son "más o menos
iguales", primando otros aspectos como esfuerzo de codificación,
legibilidad, etc. Los órdenes de complejidad sólo son importantes para
grandes problemas.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 23 de 91
7. Detallar los pasos del algoritmo " comprar samsung note4 en la
tienda Martinez Hnos de la Avda. Independencia".
2.1 VECTOR
También llamado array,es una estructura de datos que contiene una
colección de datos del mismo tipo.
Ejemplo: las temperaturas mínimas de los últimos 30 días.
Un vector, es una colecciónhomogénea de elementos a los que se accede
mediante índice. Es estático (tamaño fijo)
Ejemplo, Vector B de 5 elementos con índice 0...4. sus elementos son de
tipo persona con campos de nombre y edad.
Para declarar un array, se utilizan corchetes para indicar que se trata
de un array y no de una simple variable del tipo especificado.
Ejemplos:
Tipoidentificador [];
Tipo [] identificador;
----------------------------
Tipoidentificador [][];
Tipo [][] identificador ;
B[]fila = new B[5];
fila[0]=txtNombrecontacto.getText();
fila[1]=txtApellidoscontacto.getText();
fila[2]=txtEmail.getText();
fila[3]=txtTelefono.getText();
fila[4]=txtDireccion.getText(); ();
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 24 de 91
En programación se denomina matriz, vector (de una sola dimensión) o
formación (en inglés array)
1. A una zona de almacenamiento contiguo que contiene una serie de
elementos del mismo tipo, los elementos de la matriz.
2. Desde el punto de vista lógico una matriz se puede ver como un
conjunto de elementos ordenados en fila (o filas y columnas si tuviera
dos dimensiones).
En principio, se puede considerar que todas las matrices son de una
dimensión, la dimensión principal, pero los elementos de dicha fila
pueden ser a su vez matrices (un proceso que puedeser recursivo), lo
que nos permite hablar de la existencia de matrices multidimensionales,
aunque las más fáciles de imaginar son los de una, dos y tres
dimensiones.
Estas estructuras de datos son adecuadas para situaciones en las que el
acceso a los datos se realice de forma aleatoria e impredecible. Por el
contrario, si los elementos pueden estar ordenados y se va a utilizar
acceso secuencial sería más adecuado utilizar una lista, ya que esta
estructura puede cambiar de tamaño fácilmente durante la ejecución de
un programa.
vector[índice]
En Java, el índice de la primera componente de un vector es siempre 0.
El tamaño del array puede obtenerse utilizando la propiedad
vector.length
Por tanto, el índice de la última componente esvector.length-1
Ejemplo:Float[]notas = new float[3]; // Es vector.length - 1
Ejemplo:
Float [ ] notas = new float [3]; // array de 3 elementos
(notas)// mat, hist, ingles
Los arrays en Java son suficientes para guardar tipos básicos de datos,
y objetos de una determinadaclase cuyo número conocemos de antemano.
Algunas veces deseamos guardar objetos en un arraypero no sabemos
cuántos objetos vamos a guardar. Una solución es la de crear un array
cuyadimensión sea más grande que el número de elementos que necesitamos
guardar. La clase Vectornos proporciona una solución alternativa a este
problema. Un vector es similar a un array, ladiferencia estriba en que
un vector crece automáticamente cuando alcanza la dimensión
inicialmáxima. Además, proporciona métodos adicionales para añadir,
eliminar elementos, e insertarelementos entre otros dos existentes.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 25 de 91
Vector (array bidimensional):
tipo identificador [][];
o bien
tipo [][] identificador;
<tipo> <nombre>[][]...
Int precios[80][10];
Inicialización:
<var> = new <tipo>[<num>][<num>]...
precios = new int[80][40] //array de 80x40
NOTA: No es una buena idea que el identificador del array termine en un dígito,
p.ej. vector3
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 26 de 91
Si se rebasa la dimensión inicial guardando 21 elementos, la dimensión
del vector se duplica. Elprogramador ha de tener cuidado con este
constructor, ya que si se pretende guardar un númerogrande de elementos
se tiene que especificar el incremento de la capacidad del vector, si
no sequiere desperdiciar inútilmente la memoria el ordenador.
Con el tercer constructor, se crea un vector cuya dimensión inicial es
10.
Vector vector=new Vector();
La dimensión del vector se duplica si se rebasa la dimensión inicial,
por ejemplo, cuando sepretende guardar once elementos.
Cout <<"la suma de los números en los vectores es" <<suma; // imprime
el resultado.Cout << " \n ";
Algunas aclaraciones:
\a carácter de alarma
\b retroceso
\n nueva línea
\r regreso de carro
\t tabulador horizontal
\\ diagonal invertida
\' apóstrofe
\" comillas
Notación
La representación de un elemento en un vector se suele hacer mediante
el identificador del vector seguido del índice entre corchetes,
paréntesis o llaves:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 27 de 91
2.3 VECTORES DINÁMICOS Y ESTÁTICOS
Lo habitual es que un vector tenga una cantidad fija de memoria
asignada, aunque dependiendo del tipo de vector y del lenguaje de
programación un vector podría tener una cantidad variable de datos. En
este caso, se les denomina vectores dinámicos, en oposición, a los
vectores con una cantidad fija de memoria asignada se los denomina
vectores estáticos.
El uso de vectores dinámicos requiere realizar una apropiada gestión de
memoria dinámica. Un uso incorrecto de los vectores dinámicos, o mejor
dicho, una mala gestión de la memoria dinámica, puede conducir a una
fuga de memoria. Al utilizar vectores dinámicos siempre habrá que
liberar la memoria utilizada cuando ésta ya no se vaya a seguir
utilizando.
Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo
denominado recolector de basura (como es el caso de Java) que permiten
que el programa decida si debe liberar el espacio basándose en si se va
a utilizar en el futuro o no un determinado objeto.
Ejemplos en C
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 28 de 91
printf("\n"); // Crea una nueva línea
}
return 0
}
Ejercicios teoricos:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 29 de 91
B[0] B[1] B[2] B[3] B[4]
{Pergentino,10} {Juan, 20} {julia, 40} {Andrés, 12} {Eloísa, 16}
Ejemplo:
B=[3, 2, -1, 5, 0, 2]
B(0) B(1) B(2) B(3) B(4) B(5)
3 2 -1 5 0 2
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 30 de 91
Data[k+i] = data[k];
k--;
}
Data[k+1] = temp;
}
}
Ejemplo:
B=[3, 2, -1, 5, 0, 2]
Paso 1 >>>> 2º colocar 5 al final [2, 3, -1, 2, 0, 5]
Paso 2 >>>> 3º colocar 3 antes de 5 [0, 2, -1, 2, 3, 5]
Paso 3 >>>> 4º colocar 2 [0, 2, -1, 2, 3, 5]
Paso 4 >>>> 5º colocar 2 [0, -1,2, 2, 3, 5]
Paso 5 >>>> 6º colocar 0 [-1, 0, 2, 2, 3, 5]
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 31 de 91
mayor que el que está en la siguiente posición se intercambian. Es un
algoritmo estable. El inconveniente es que es muy lento.
Ejemplo:
static void burbuja_lims(int v[])
{
int buffer;
int i, j;
for (i = 0; i<v.length; i++)
{
For (j = 0; j<i; j++)
EJERCICIOS:
1. Crear una función o método de un vector con un array de 10
elementosasignando sus índices y valores.
2. Ordena por selección los elementos del array
Notas=[M,Z,I,L,O,R].
3. Ordena por quicksortlos elementos del array
Notas=[1,Z,8,L,0,O,R].
4. ¿Cómo se ordenan los elementos de un vector mediantemergesort?
5. ¿Cuál es la función de la técnica divide y vencerás?.
6. Diferencia entre los ordenamientos quicksort y mergesort.
7. Diferencia entre los ordenamientos quicksort y selección.
3.1 LISTAS
La lista es una estructura dinámica, ya que la longitud aumenta al
insertar y se reduce al suprimir un elemento.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 34 de 91
Nodo
Para la implementación de TDA’s como ser listas, pilas o colas, es
necesario utilizarnodos. Un nodo es una estructura que contiene un
elemento (El dato que se desea guardaren la estructura), y una
referencia a otro nodo. De esta forma es posible encadenar los
nodos pudiendo guardar una cantidad ilimitada de elementos.
Ejemplo:
2 0 -9 7 6 4 -5 8 -3 0 4
(posición de 1 a 11)
La operación insertar (5, 4) inserta 5 en la posición 4, por tanto, la
lista resultante es:
2 0 -9 7 5 6 -5 8 -3 0 4
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 35 de 91
Ejemplo de una lista simple (código C++):
#include <stdio.h>
struct _agenda {
char nombre[20];
char telefono[12];
struct _agenda *siguiente;
};
void mostrar_menu() {
printf("\n\nMenú:\n=====\n\n");
printf("1.- Añadir elementos\n");
printf("2.- Borrar elementos\n");
printf("3.- Mostrar lista\n");
printf("4.- Salir\n\n");
printf("Escoge una opción: ");
fflush(stdout);
}
printf("\nNuevo elemento:\n");
printf("Nombre: "); fflush(stdout);
gets(nuevo->nombre);
printf("Teléfono: "); fflush(stdout);
gets(nuevo->telefono);
nuevo->siguiente = NULL;
if (primero==NULL) {
printf( "Primer elemento\n");
primero = nuevo;
ultimo = nuevo;
} else {
void mostrar_lista() {
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 36 de 91
struct _agenda *auxiliar; /* lo usamos para recorrer la lista */
int i;
i=0;
auxiliar = primero;
printf("\nMostrando la lista completa:\n");
while (auxiliar!=NULL) {
printf( "Nombre: %s, Telefono: %s\n",
auxiliar->nombre,auxiliar->telefono);
auxiliar = auxiliar->siguiente;
i++;
}
if (i==0) printf( "\nLa lista está vacía!!\n" );
}
int main() {
char opcion;
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 37 de 91
21. Tlista t, q = new(struct nodo);
22.
23. q->nro = valor;
24.
25. q->sgte = NULL;
26.
27. if(lista==NULL)
28. {
29. lista = q;
30. }
31.
32. else
33.
34. {
35. t = lista;
36. while(t->sgte!=NULL)
37. {
38. t = t->sgte;
39. }
40.
41. t->sgte = q;
42. }
43. }
44.
45. /*----------------------Mostrar Lista---------------------------*/
46. void reportarLista(Tlista lista)
47.
48. {
49. int i = 0;
50.
51. while(lista != NULL)
52.
53. {
54. cout <<' '<< i+1 <<") " << lista->nro << endl;
55.
56. lista = lista->sgte;
57.
58. i++;
59. }
60. }
61.
62. void calcularMayMenProm(Tlista,int mayor, int menor,int promedio,i
nt n){
63.
64. while(lista!=NULL){
65.
66. if(mayor<(lista->nro))
67.
68. mayor=lista->nro;
69.
70. if(menor>(lista->nro))
71.
72. menor=lista->nro;
73.
74. promedio+=lista->nro;
75.
76. lista=lista->sgte;
77. }
78.
79. promedio=promedio/n;
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 38 de 91
80.
81. cout<<endl<<"mayor:"<<mayor<<endl;
82.
83. cout<<endl<<"menor:"<<menor<<endl;
84.
85. cout<<endl<<"promedio:"<<promedio<<endl<<endl;
86. }
87.
88. /*---------------- Funcion Principal -------------------*/
89.
90. int main(void)
91.
92. {
93. Tlista lista = NULL;
94.
95. system("color 0a");
96.
97. cout<<"\n\n\t\t[ EJERCICIOS LISTAS SIMPLES ]\n";
98.
99. cout<<"\t\t-----------------------------\n\n";
100.
101. cout<<" EJERCICIO 1: Calcular mayor,menor y promedio de una
lista"<<endl<<endl;
102.
103. cout<<"\n Ingrese tamanio de lista: ";
104.
105. cin>>n;
106.
107. for(int i=1;i<=n;i++){
108.
109. insertarSgte(lista,i);
110. }
111. cout<<endl<<"Elementos de lista"<<endl;
112. reportarLista(lista);
113.
114. mayor=lista->nro;
115.
116. menor=lista->nro;
117.
118. promedio=lista->nro;
119.
120. lista=lista->sgte;
121.
122. calcularMayMenProm(lista, mayor, menor, promedio, n);
123.
124. system("pause");
125.
126. return 0;
127. }
3.2 PILA
La pila es una secuencia de elementos del mismo tipo en la que el
acceso a la misma se realiza por un único lugar denominado tope o cima
según la política LIFO (Last In, First Out)en primero en entrar es el
primero en salir:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 39 de 91
pop
push
Tope o cima
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 40 de 91
Un método de pila estática:
Public class PilaEstatica {
Public static void main (String [] args) {
Int dato;
Int pila [] = new int [5];
Scanner teclado = new Scanner (System.in);
For (int tope=0; tope<=4; tope++)
{
System.out.println ("proporciona datos para la pila");
Dato = teclado.nextInt();
Pila[tope]=dato;
}
For (int tope=4; tope>=0; tope --)
System.out.println("la pila tiene los siguientes datos: "+pila[tope]);
}
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 41 de 91
Si hubiéramos usado el constructor por defecto se hubiera establecido
el tamaño de la pila en 1000 elementos.
Definimos un campo privado top para conocer en todo momento cuál es la
cima de la pila. De esta forma, si queremos añadir un nuevo elemento a
la pila (push) lo haremos en la posición siguiente a la que nos indica
este campo. Observe como sólo se inserta un nuevo elemento sobre la
cima cuando hay espacio suficiente, es decir la longitud de la pila es
menor que su capacidad. Primero se incrementa el valor del campo top y
después se inserta el elemento en la pila .
Lenguaje C:
1. #include <conio.h>
2. #include <stdio.h>
3. #include <stdlib.h>
4. #include <ctype.h>
5.
6. struct productos
7. {
8. int codigo;
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 42 de 91
9. char nombre[50];
10. int existencia;
11. float precio;
12. };
13.
14. struct nodo
15. {
16. struct productos dato;
17. struct nodo *proximo;
18. };
19.
20. /* Declaracion de funciones */
21. void archivo(FILE *fp);
22. struct nodo *nuevonodo();
23. struct nodo *creapila(struct nodo *pri, struct productos x);
24. void muestra(struct nodo *pri, FILE *fp);
25. /* Fin de Declaracion */
26.
27. void main()
28. {
29. struct productos x;
30. struct nodo *pri=NULL;
31. FILE *fp;
32. char opcion; float auxiliar=0;
33. if((fp=fopen("C:\\Datos.txt","wb"))==NULL)
34. {
35. getch();
36. }
37. fseek(fp,0,2);
38. do
39. {
40. fflush(stdio);
41. printf("Ingrese el Codigo de Producto ");
42. scanf("%d",&x.codigo);
43. fflush(stdin);
44. printf("Ingrese Nombre de Producto ");
45. gets(x.nombre);
46. fflush(stdin);
47. printf("Ingrese la Existencia ");
48. scanf("%d",&x.existencia);
49. fflush(stdin);
50. printf("Ingrese el Precio ");
51. scanf("%f",&auxiliar); x.precio=auxiliar;
52. pri=creapila(pri,x);
53. fflush(stdin);
54. printf("Desea Ingresar otro Registro? (S/N) ");
55. scanf("%c",&opcion); opcion=toupper(opcion);
56. } while(opcion=='S');
57. muestra(pri,fp);
58. fflush(stdin);
59. printf("El contenido de la Pila se ha Guardado. Desea
Visualizarlo? (S/N)");
60. scanf("%c",&opcion); opcion=toupper(opcion);
61. if(opcion=='S') archivo(fp);
62. getch();
63. fclose(fp);
64. }
65.
66. struct nodo *creapila(struct nodo *pri, struct productos x)
67. {
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 43 de 91
68. struct nodo *p;
69. p=nuevonodo();
70. (*p).dato=x;
71. (*p).proximo=pri;
72. return p;
73. }
74.
75. struct nodo *nuevonodo()
76. {
77. struct nodo *p;
78. p=(struct nodo *)malloc(sizeof(struct nodo));
79. if(p==NULL)
80. {
81. printf("Memoria RAM Llena");
82. getch();
83. exit(0);
84. }
85. return p;
86. }
87.
88. void muestra(struct nodo *pri, FILE *fp)
89. {
90. clrscr();
91. struct nodo *aux;
92. while(pri!=NULL)
93. {
94. printf("Codigo: %d \n",(*pri).dato.codigo);
95. printf("Nombre: %s \n",(*pri).dato.nombre);
96. printf("Existencia: %d \n",(*pri).dato.existencia);
97. printf("Precio: %0.2f \n\n",(*pri).dato.precio);
98. fwrite(&pri->dato,sizeof(struct productos),1,fp);
99. aux=pri;
100. pri=(*pri).proximo;
101. free(aux);
102. }
103. }
104.
105. void archivo(FILE *fp)
106. {
107. struct productos x;
108. clrscr();
109. printf("Datos del Archivo:\n\n");
110. fread(&x,sizeof(struct productos),1,fp);
111. while(!feof(fp))
112. {
113. printf("Codigo: %d \n",x.codigo);
114. printf("Nombre: %s \n",x.nombre);
115. printf("Existencia: %d \n",x.existencia);
116. printf("Precio: %0.2f \n\n",x.precio);
117. fread(&x,sizeof(struct productos),1,fp);
118. }
119. printf("Fin de Archivo");
3.3 COLA
Una cola es una estructura de datos donde el primer elemento en entrar
es el primero en salir, también denominadas estructuras FIFO (First In,
First Out).
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 44 de 91
Una cola es un contenedor de objetos cuya inserción y eliminación sigue
la política FIFO.
En una Cola los elementos se añaden desde la parte de atrás o la parte
final de la cola, sin embargo la información se extrae desde el frente,
es decir, los elementos que se añadieron primero serán los primeros en
salir, esto se conoce como estructura FIFO (First In First Out).
2 4 7 9 12 21 25 31 31
Vector[ ];
ColaEnlazada.java
Vemos como la clase Cola contiene dos campos, cola y cabecera que
apuntan al principio y al final de la cola. La cabecera la utilizaremos
para extraer elementos. Para insertar utilizaremos la cola.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 45 de 91
La operación encolar crea un nodo cuyo sucesor es nulo. Esto es porque
añadimos al final de la cola, es decir, donde apunta el campo cola. Si
la cola es vacía la cabecera y la cola apuntan al mismo objeto Nodo.
Esta estructura de datos se puede definir como una lista enlazada con
acceso FIFO a la que sólo se tiene acceso al final de la lista para
meter elementos y al principio de esta para sacarlos.
En este .cpp se pide el ingreso por teclado de un conjunto de datos de
manera iterativa hasta que se ingrese la palabra "fin" cuando la
consola pida el dato "Nombre". Una vez finalizado el ingreso, y si hay
datos en la cola, se procede a mostrarlos navegando mediante las
estructuras (struct). Cada estructura contiene la posición de memoria
de la estructura siguiente en la cola, por lo que se las recorrerá
hasta el final y se las irá eliminando de la memoria (ya que
conceptualmente un nodo debe leerse de memoria una única vez).
Ejemplo de cola.cpp
Lenguaje C:
1. #include <stdio.h>
2. #include <conio.h>
3. #include <stdlib.h>
4. #include <string.h>
5. struct agenda
7. {
8. char nombre[50];
9. char telefono[25];
10. char mail[50];
11. };
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 46 de 91
13. struct nodo
14. {
15. struct agenda dato;
16. struct nodo *proximo;
17. };
19. struct nodo *nuevonodo();
20. int colavacia(struct nodo *);
21. struct nodo *creacola(struct nodo *, struct agenda);
22. void mostrar(struct nodo *);
23.
24. void main()
25. {
26. struct nodo *pri=NULL, *ult=NULL;
27. struct agenda x;
28. printf("Ingrese nombre: ");
29. gets(x.nombre);
30. while(strcmpi(x.nombre,"fin"))
31. {
32. printf("Ingrese telefono: ");
33. gets(x.telefono);
34. printf("Ingrese mail: ");
35. gets(x.mail);
36. ult=creacola(ult,x);
37. if(pri==NULL) pri=ult; // Si es la 1º pasada pongo en pri el
valor del primer nodo
38. printf("Ingrese nombre: ");
39. gets(x.nombre);
40. }
41. if(colavacia(pri)==1) { printf("No se ingresaron registros");
getch(); }
42. else mostrar(pri);
43. }
45. struct nodo *nuevonodo()
46. {
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 47 de 91
47. struct nodo *p;
48. p=(struct nodo *)malloc(sizeof(struct nodo));
49. if(p==NULL)
50. {
51. printf("Memoria RAM Llena");
52. getch();
53. exit(0);
54. }
55. return p;
56. }
58. struct nodo *creacola(struct nodo *ult, struct agenda x)
59. {
60. struct nodo *p;
61. p=nuevonodo();
62. (*p).dato=x;
63. (*p).proximo=NULL;
64. if(ult!=NULL) (*ult).proximo=p; // Si hay nodo anterior en //
prox pongo la dirección del nodo actual
65. return p;
66. }
68. int colavacia(struct nodo *pri)
69. {
70. if(pri==NULL) return 1;
71. else return 0;
72. }
74. void mostrar(struct nodo *pri)
75. {
76. struct nodo *aux;
77. while(pri!=NULL)
78. {
79. printf("Nombre: %s - Telefono: %s - Mail: %s
\n",pri>dato.nombre,pri->dato.telefono,pri->dato.mail);
80. aux=pri;
81. pri=(*pri).proximo;
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 48 de 91
82. free(aux);
83. }
84. getch();
}
Ejercicios en clase.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 49 de 91
todos los nodos del grafo es llamado tour. El número de aristas en un
camino es la longitud del camino.
A)matriz de adyacencia:
Tipo grafoadya = registro
Nodo: vector [ n ] de información
Adyacencia: matriz [n, n] de booleanos
Vector de nodos
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 50 de 91
Malabo Baney Bata Mbini Niefang
Matriz de adyacencia
Malabo Baney Bata Mbini Niefang
Malabo 0 1 1 0 0
Baney 1 0 0 0 0
Bata 1 0 0 1 1
Mbini 0 0 1 0 0
Niefang 0 0 1 0 0
B)lista de adyacencia:
Tipo grafolista = vector[n] de registro
Nodo: información
Vecinos: lista de nodos
A cada nodo i, se le asocia una lista formada por todos los nodos j
tales que existe a arista (i,j).
Si el numero de aristas es pequeño, esta representación utiliza menos
espacio. También se analiza rápidamente todos los vecinos de un nodo.
Sin embargo, es menos eficiente el determinar si existe o no una
conexión directa entre nodos.
Baney Malab
o
Mbini
Nota: Los elementos de la lista de adyacencia son referencias a los nodos del vector de nodos.
Niefang
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 51 de 91
figura 1
A figura 2
C D
AC D
Ejercicios
Ejemplo de un grafo
-----------------------------------------
Matriz de adyacencia:
las aristas del grafo se guardan en una matriz, indicando si un
nodo tiene enlace directo con otro.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 52 de 91
/*
O\D 0 1 2 3 4 5
0 0 1 0 1 0 0
1 0 0 1 0 1 0
2 0 0 0 0 1 0
3 0 1 0 0 0 0
4 0 0 0 1 0 1
5 0 0 1 0 0 0
0 -> 1 3
1 -> 2 4
2 -> 4
3 -> 1
4 -> 3 5
5 -> 2
// En C++, podemos usar un vector de vectores para guardar la lista
anterior:
vector<vector<int>> A(6);
//para cada posición origen añadir vecino
A[0].push_back(1);
A[0].push_back(3);
A[1].push_back(2);
A[1].push_back(4);
A[2].push_back(4);
A[3].push_back(1);
A[4].push_back(3);
A[4].push_back(5);
A[5].push_back(2);
// Lista de aristas: se guarda una lista de todas las aristas del
grafo.
(0,1) (0,3) (1,2) (1,4) (2,4) (3,1) (4,3) (4,5) (5,2)
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 53 de 91
//insertamos las aristas en el vector
A.push_back(make_pair(0, 1));
A.push_back(make_pair(0, 3));
A.push_back(make_pair(1, 2));
A.push_back(make_pair(1, 4));
A.push_back(make_pair(2, 4));
A.push_back(make_pair(3, 1));
A.push_back(make_pair(4, 3));
A.push_back(make_pair(4, 5));
A.push_back(make_pair(5, 2));
b) Lista de adyacencia:
0 -> 1 3
1 -> 2 4
2 -> 4
3 -> 1
4 -> 3 5
5 -> 2
4.2 ÁRBOLES
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 54 de 91
Se define un camino en un árbol como cualquier secuencia denodos
del árbol, n1 ... np, que cumpla que cada nodo es padre delsiguiente en
la secuencia (es decir, que ni es el padre de ni+1). Lalongitud del
camino se define como el número de nodos de la secuencia menos uno (p-
1).
Los descendientes de un nodo(c en el diagrama) son aquellos nodos
accesibles por un camino que comience en el nodo.
Los ascendientes de un nodo(f en el diagrama) son los nodos
del camino que va desde la raíz a él.
4.2.1 REPRESENTACIONES
Las representaciones del TAD Directorio (elementos con
relación de jerarquía) suelen ser representaciones enlazadas,
donde cada nodo almacena enlaces al nodo padre y/o a los nodos
hijos.
El único nodo distinguido es el nodo raíz.
El método más habitual de realizar las operaciones es
mediante un iterador (cursor) que marca un nodo concreto que
sirve de referencia.
Otra posibilidad es indicar un nodo concreto mediante el
camino de la raíz a ese nodo.
Padre - primer hijo - hermano
Los nodos tienen un número fijo de enlaces: al padre, al primer
hijo y al siguiente hermano.
La lista de hijos está representada como una lista enlazada.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 55 de 91
Árbol binario: Es un árbol que o bien está vacío (sin contenido)o bien
consta de un nodo raíz con dos subárboles binarios,denominados
izquierdo y derecho.
La existencia de árboles vacíos es una convención para que no
exista ambigüedad al identificar el subárbol izquierdo y derecho. Se
representa por un cuadrado.
La altura de un árbol vacío es -1 a
Cada nodo puede tener 0 hijos (subárbol izquierdo y derecho
vacíos), 1 hijo (algún subárbol vacío) o 2 hijos.
4.2.2 ALTURA
Se define la altura de un nodo en un árbol como la longitud
delcamino más largo que comienza en el nodo y termina en una hoja.
La altura de un nodo hoja es 0.
La altura de un nodo es igual a la mayoraltura de sus hijos + 1.
La altura de un árbol se define como la altura de la raíz.
La altura de un árbol determina la eficiencia de la mayoría de
operaciones definidas sobre árboles.
4.2.3 PROFUNDIDAD
Se define la profundidad de un nodo en un arbol como la longitud
del camino (único) que comienza en la raíz y termina en el nodo.
También se denomina nivel.
La profundidad de la raiz es 0.
La profundidad de un nodo es igual a la profundidad de supadre + 1
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 56 de 91
4.2.4 RECORRIDO DE ÁRBOLES
Un árbol tiene tres tipos de recorridos: Preorden, Inorden, Postorden.
Preorden: Se pasa por la raíz y luego se recorre en preorden cada
uno de los subárboles. Recursivo.
Postorden: Se recorre en postorden cada uno de los subárboles y
luego se pasa por la raiz. Recursivo.
Inorden: Se recorre en inorden el primer subárbol (si existe). Se
pasa por la raíz y por último se recorre en inorden cada uno de los
subárboles restantes. Tiene sentido fundamentalmente en árboles
binarios. Recursivo.
Por Niveles: Se etiquetan los nodos según su profundidad (nivel).
Se recorren ordenados de menor a mayor nivel, a igualdad de nivel se
recorren de izquierda a derecha.
No recursivo: Se introduce el raiz en una cola y se entra en un
bucleen el que se extrae de la cola un nodo, se recorre su elemento y
se insertan sus hijos en la cola
Otro ejemplo:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 57 de 91
Para recorrer un árbol binario no vacío en preorden, hay que realizar
las siguientes operaciones recursivamente en cada nodo, comenzando con
el nodo de raíz:
1. Visite la raíz
2. Atraviese el sub-árbol izquierdo
3. Atraviese el sub-árbol derecho
Recorrido en profundidad.
Se trata de recorrer el grafo visitando primero los hijos que los
hermanos.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 58 de 91
Recorrido en anchura.
Recorrer el grafo visitando primero los hermanos que los hijos.
Solución: A-B-E-I-F-C-G-J-K-H-D
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 59 de 91
2. Crea un árbol de 5 nodos e indica el INORDENsu recorrido asc.
3. Trace el recorrido descendente de este árbol.
En anchura En profundidad
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 60 de 91
Es posible almacenar un árbol completo en un vector en el orden dado
por su recorrido por niveles, y a partir del índice de un elemento en
el vector conocer el índice de su nodo padre y los de sus nodos hijos:
//Constructor
public ArbolBin(){
Raiz = null;
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 62 de 91
A.insertaNodo(2);
A.insertaNodo(23);
A.insertaNodo(24);
System.out.print("El recorrido en Preorden es: ");
A.preorden (A.Raiz);
System.out.println();
System.out.print("El recorrido en Inorden es: ");
A.inorden (A.Raiz);
System.out.println();
System.out.print("El recorrido en Postorden es: ");
A.postOrden (A.Raiz);
System.out.println();
System.out.println("La altura del arbol es: " + A.altura
(A.Raiz));
System.out.println("La cantidad de \"nodos\" que posee el
arbol es: " + A.tamaño(A.Raiz));
}
}
/*-------------------------------------------------------------
creacion del nodo del arbol
*/
//Constructores
NodoB (int Elem){
dato = Elem;
NodoB Hizq, Hder = null;
}
NodoB (){
NodoB Hizq, Hder = null;
}
public void insertar(int Elem){
if(Elem < dato){
if (Hizq == null)
Hizq = new NodoB(Elem);
else
Hizq.insertar(Elem);
}
else{
if (Elem > dato){
if (Hder == null)
Hder = new NodoB(Elem);
else
Hder.insertar(Elem);
}
}
}
}
Gráficamente:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 64 de 91
A[...heap-zise[A]] es el montículo representado.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 65 de 91
El significado de heapen ciencia computacional es el de una cola de
prioridades (priority queue).
Tiene las siguientes características:
Un heap es un arreglo de “n” posiciones ocupado por los elementos
de la cola. (Nota: seutiliza un arreglo que inicia en la posición 1 y
no en cero, de tal manera que al implementarla en C# se tienen n+1
posiciones en el arreglo.)
Se mapea un árbol binario de tal manera en el arreglo que el nodo
en la posición i es el padre de los nodos en las posiciones (2*i) y
(2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos.
Por consiguiente, el nodo padre tiene el mayor valor de todo su
subárbol.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 66 de 91
momento, un elemento con una prioridad arbitraria puede ser insertado
en la cola. Una estructura de datos que soporta estas dos operaciones
es la cola de prioridad máxima (mínima).
Existen tres categorías de un heap: max heap, min heap y min-max heap.
Un max (min) tree es un árbol en el cual el valor de la llave de cada
nodo no es menor (mayor) que la de los valores de las llaves de sus
hijos (si tiene alguno). Un max heap es un árbol binario completo que
es también un max tree. Por otra parte, un min heap es un árbol binario
completo que es también un min tree.
De la definición se sabe que la llave del root de un min tree es la
menor llave del árbol, mientras que la del root de un max tree es la
mayor.
Si la llave (key) de cada nodo es mayor que o igual a las llaves de sus
hijos, entonces la estructura heap es llamada max heap.
Si la llave (key) de cada nodo es menor que o igual a las llaves desus
hijos, entonces la estructura heap es llamada min heap.
En una estructura min-max heap, un nivel satisface la propiedad min heap,
y el siguiente nivel inferior satisface la propiedad max heap,
alternadamente. Un min-max heap es útil para colas de prioridad de doble
fin.
Las operaciones básicas de un heap son:
Ejercicios __.__.20__:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 67 de 91
PARTE II
DISEÑO DE ALGORITMOS
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 68 de 91
TEMA 6: RECURSIVIDAD Y DISEÑO ITERATIVO
6.1 RECURSIVIDAD
Recursiva: que puede repetirse indefinidamente. Un programa informático.
Esto dará lugar a una solución iterativa en Java mediante un bucle for:
// Método Java no recursivo para calcular el factorial de un número
public double factorial(int n){
double fact=1;
int i;
if (n==0)
fact=1;
else
for(i=1;i<=n;i++)
fact=fact*i;
return fact;
}
Pero existe otra definición de factorial en función de sí misma:
0! = 1
n!=n(n – 1)!, si n>0(El factorial de n es n por el factorial de n-1)
Esta definición da lugar a una solución recursiva del factorial en Java:
// Método Java recursivo para calcular el factorial de un número
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 69 de 91
public double factorial(int n){
if (n==0)
return 1;
else
return n*(factorial(n-1));
}
Un método es recursivo cuando entre sus instrucciones se encuentra una
llamada a sí mismo.
La solución iterativa es fácil de entender. Utiliza una variable para
acumular los productos y obtener la solución. En la solución recursiva se
realizan llamadas al propio método con valores de n cada vez más pequeños
para resolver el problema.
Cada vez que se produce una nueva llamada al método se crean en memoria
de nuevo las variables y comienza la ejecución del nuevo método.
Para entender el funcionamiento de la recursividad, podemos pensar que
cada llamada supone hacerlo a un método diferente, copia del original,
que se ejecuta y devuelve el resultado a quien lo llamó.
En la figura siguiente podemos ver cómo sería la ejecución del programa
Java anterior para calcular el factorial de 3.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 70 de 91
Una o más llamadas recursivas: casos en los que se llama sí mismo.
Caso base: Siempre ha de existir uno o más casos en los que los valores
de los parámetros de entrada permitan al método devolver un resultado
directo. Estos casos también se conocen como solución trivial del
problema.
En el ejemplo del factorial el caso base es la condición:
if (n==0)
return 1;
si n=0 el resultado directo es 1 No se produce llamada recursiva
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 71 de 91
Veamos el algoritmo en pseudo código
Hanoi( int n, int start, int destination, int open )
Hanoi( n - 1, start, open, destination )
Move( n, start, destination )
Hanoi( n - 1, open, destination, start )
Ejemplos:
Un ejemplo habitual de una operación cursiva es un factorial. El factoral
de un número es el producto de los enteros positivos menores o iguales
que ese número. Resolver este problema recursivamente requiere
multiplicar el número inicial por sí mismo menos 1. La expresión
recursiva es n(n - 1), donde n es el número inicial. Cada paso es un poco
más sencillo que el paso anterior. La operación termina cuando n se
reduce a 1. Un ejemplo de una iteración es encontrar la suma de un
conjunto de números. La expresión iterativa es (n + (n + 1)), donde n es
el número inicial. Cada paso empieza con la solución del paso anterior.
La operación termina cuando n llega al número deseado.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 72 de 91
Ventajas:
- Ventajas de la Recursión ya conocidas
– Soluciones simples, claras.
– Soluciones elegantes.
– Soluciones a problemas complejos.
• Desventajas: INEFICIENCIA
– Sobrecarga asociada con las llamadas a subalgoritmos.
Semejanzas:
- Ambas estrategias implican repetición: la iteración usa explícitamente
una estructura de repetición mientras que en la recursión está implícita.
- Ambas requieren una condición de corte: la iteración cuando llega al
tope del contador y la recursión cuando alcanza el estado base.
- Ambas se aproximan a la solución gradualmente: la iteración modificando
las variables iterativamente y la recursión produciendo versiones más
sencillas del problema original.
- Ambas pueden caer en bucles infinitos.
Diferencias:
- La recursividad produce algoritmos cortos y elegantes, mientras que la
iteración presentan la habitual forma de uno o varios bucles.
- La recursión conlleva una repetida invocación de la función que, en
general, incurre en un gasto de tiempo y de memoria que no se da en la
versión iterativa.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 73 de 91
La solución se puede presentar como una secuencia dedecisiones
Medida local de optimización.
Las decisiones son irreversibles.
No siempre encuentra la solución óptima, pero en ocasionespermite
encontrar una solución aproximada con un costecomputacional bajo.
Esquema Voraz
Algoritmo Voraz: Obtiene un subconjunto de C queoptimiza la función
objetivo. Para ello:
Seleccionar en cada instante un candidato (criterio local de
Optimización).
Añadir el candidato a la solución en curso si es completable (o
factible), sino rechazarlo.
Repetir los dos puntos anteriores hasta obtener la solución (o
noquedan más candidatos).
Recordemos ...
Un algoritmo voraz no siempre proporciona la solución óptima.
Las decisiones son irreversibles.
Ejemplo de cambio de monedas:
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 74 de 91
Un algoritmo voraz determina el minimo numero de monedas que debe
devolverse en el cambio. En la figura se muestran los pasos que un ser
humano deberia seguir para emular a un algoritmo voraz para acumular 36
centimos usando solo monedas de valores nominales de 1, 5, 10, 20. La
moneda del mayor valor menor que el resto debido es el optimo local en
cada paso. Nótese que en general el problema de devolucion del cambio
requiereprogramacion dinamica o lineal para encontrar una solucion
optima. Sin embargo, en muchos sistemas monetarios, incluyendo el euro
y el dólaramericano, son casos especiales donde en la estrategia del
algoritmo voraz da con la solucion optima.
Problema del cambio en monedas.
– Se trata de devolver una cantidad de pesetas con el menor número
posible de monedas.
– Se parte de:
Un conjunto de tipos de monedas válidas, de las que se supone que
hay cantidad suficiente para realizar el desglose.
Y de un importe a devolver.
Solución:
-----------------------------------------------------
tipo moneda=(M25,M10,M5,M1) {por ejemplo}
función cambia(importe:nat;
valor:vector[moneda] de nat)
devuelve vector[moneda] de nat
variable mon:moneda;
cambio:vector[moneda] de nat
inicio
para todo mon en moneda hacercambio[mon]:=0
fpara;
para mon:=M25 hasta M1 hacer
mq valor[mon]£importe hacer
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
fmq
fpara;
devuelve cambio
fin
-------------------------------------------------------
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 75 de 91
7.2 ALGORITMOS DIVIDE Y VENCERÁS.
Este tipo de algoritmos se usa en la resolución de problemas que pueden
ser simplificados en problemas más sencillos, cuando hablo de
simplificación del problema me refiero a reducir el volumen de datos
manejados.
Se pueden distinguir tres partes fundamentales:
1. Los casos base: son las sentencias que se ejecutarán cuando no sea
posible reducir más el problema
2. La simplificación del problema: es un bloque de instrucciones cuya
finalidad es dividir el problema en subproblemas menores del mismo
tipo.
3. La parte recursiva: consiste en hacer una llamada a la propia
función para que trabaje sobre los subproblemas obtenidos
anteriormente.
Ejemplo 1:
Se quiere encontrar un algoritmo para obtener, si lo hay, el elemento
mayoritario de una colección de números enteros.
Se considera elemento mayoritario a aquel que aparece más de n/2 veces,
donde n es la cantidad de elementos de la colección de datos.
En la imagen se muestra el diagrama de flujo del algoritmo implementado
para la resolución del problema.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 76 de 91
}
}
/**
* Devuelve un entero correspondiente al elemento mayoritario de un
*ArrayList de enteros.
*¡Ojo porque el contenido del ArrayList se pierde!
* @param cjto Si quiere conservar los datos pase una copia del original
* @return
* @throws mayoritario.Mayoritario.NoMayoritarioException
*/
public int calcMayoritario(ArrayList<Integer> cjto)throws NoMayoritarioException{
//Inicio de los casos base
if(cjto.size()<2){
throw new NoMayoritarioException();
}
switch(cjto.size()){
case 2:
if(cjto.get(0) ==cjto.get(1)) {
return cjto.get(0);
}
throw new NoMayoritarioException();
case 3:
if(cjto.get(0) ==cjto.get(1)||cjto.get(0) ==cjto.get(2)) {
return cjto.get(0);
}else if(cjto.get(2) ==cjto.get(1)){
return cjto.get(1);
}
throw new NoMayoritarioException();
}
if(cjto.size()==2){
}
//Selección de candidatos
ArrayList<Integer> candidatos;
candidatos = new ArrayList<>();
for(int i=0;i<cjto.size()-2;i+=3){
if(cjto.get(i) ==cjto.get(i+1) || cjto.get(i) ==cjto.get(i+2)){
candidatos.add(cjto.get(i));
}if(cjto.get(i+1) ==cjto.get(i+2)){
candidatos.add(cjto.get(i+1));
}
}
int len=cjto.size();
if(len%2==0 && cjto.get(len-2) ==cjto.get(len-1)){
candidatos.add(cjto.get(len-1));
}
//Aplico la recursión
if(candidatos.size()>=cjto.size()/2){
//Alivio un poco la carga espacial, con lo que se pierden los datos de partida
cjto=null;
return this.calcMayoritario(candidatos);
}else{
throw new NoMayoritarioException();
}
}
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 77 de 91
cuando el primer elemento es el mayoritario por lo que tendrá
complejidad lineal, pero en el resto de casos será cuadrática
Otra opción pasa por ordenar primero la colección, pero habría que
tener en cuenta la complejidad del algoritmo de ordenación.
Otra posibilidad sería utilizar un algoritmo dinámico que se apoyase en
una colección de posibles soluciones, donde cada elemento está
compuesto por el valor y el número de repeticiones. En ese caso se
recorrería una sola vez la colección inicial y un máximo de n veces, en
el peor de los casos, la colección auxiliar para comprobar si el valor
i-ésimo ya se encuentra en la colección auxiliar e insertarlo o
incrementar el valor de sus repeticiones. Por lo que tanto la
complejidad espacial como temporal serán mayores.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 78 de 91
A continuación se muestra el código en Java correspondiente a la implementación del algoritmo.
public static void quickSort(int[] a,int prim, int ult){
if(prim<ult){
//Genero subconjuntos
int l=pivote(a,prim,ult);
//Aplico recursión sobre los subconjuntos
if(l>prim){quickSort(a,prim,l-1);}
if(l<ult){quickSort(a,l+1,ult);}
}//Caso base prim=ult
}
/**
* Devuelve la posición del pivote, elemento que por la izquierda
solo
* tiene elementos de valor inferior y por la derecha de valor
superior.
* Sobra decir que lo que hace es colocar los elementos a derecha
o
* del pivote según su valor.
*/
private static int pivote(int[] a,int prim, int ult){
int i=prim+1;
int l=ult;
while(a[i]<=a[prim] && i<ult){i++;}
while(a[l]>a[prim]){l--;}
while(i<l){
intercambia(a,i,l);
while(a[i]<=a[prim]){i++;}
while(a[l]>a[prim]){l--;}
}
intercambia(a,prim,l);
return l;
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 79 de 91
Si expandimos a dos pasos recursivos más, se ve así:
// metodo ejecutor:
public static void main(String[] args) {
// TODO code application logic here
int a[]={1,2,7,8,9,10};
int b[]={1,2,7,8,9,10};
if (sonIgualesDyV(a,b,0, a.length-1))
System.out.println("Los vectores son iguales");
else
System.out.println("Los vectores no son iguales");
}
#include <stdio.h>
#include <stdlib.h>
scanf("%d",&num);
for (i=0;i<num;i++){
scanf("%d",&serie[i]);
}
for (i=0;i<num;i++){
if (i>0 && serie[i]>serie[i-1] && currlong){
currlong++;
currend=i;
if (currlong>smalllong){
smallstart=currstart;
smallend=currend;
smalllong=currlong;
}
}else
if (currlong==0){
if (serie[i]<0){
currlong=1;
currstart=i;
currend=i;
}
}else if (serie[i]<serie[i-1] && currlong){
if (serie[i]<0){
currlong=1;
currstart=i;
currend=i;
}
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 81 de 91
}
for (i=smallstart;i<=smallend;i++){
printf("%i ",serie[i]);
}
return 0;
}
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 82 de 91
8.3.2 GRAFOS UNIDIRECCIONAL
Cada arco apunta a un solo nodo.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 83 de 91
PARTE III
INTELIGENCIA ARTIFICIAL
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 84 de 91
TEMA 9: TÉCNICAS DE BÚSQUEDA HEURÍSTICA EN GRAFOS.
Los algoritmos de búsqueda en grafos nacen por la necesidad de crear
un mecanismo de navegación autónoma, bien sea de robots, coches, o
personajes en un videojuego. Algunos de los más conocidos
son A*, LPA*, o D*.
Los métodos de búsqueda heurística disponen de alguna información sobre
la proximidad de cada estado a un estado objetivo, lo que permite
explorar en primer lugar los caminos más prometedores.
Son características de los métodos heurísticos:
No garantizan que se encuentre una solución, aunque existansoluciones.
_ Si encuentran una solución, no se asegura que ésta tenga lasmejoresas
propiedades (que sea de longitud mínima o de costeóptimo).
_ En algunas ocasiones (que, en general, no se podrán determinar
apriori), encontrarán una solución (aceptablemente buena) en untiempo
razonable .
En general, los métodos heurísticos son preferibles a losmétodos no
informados en la solución de problemasdifíciles para los que una
búsqueda exhaustiva necesitaríaun tiempo demasiado grande. Esto cubre
prácticamente latotalidad de los problemas reales que interesan en
Inteligencia Artificial.
_ La información del problema concreto que estamosintentando resolver
se suele expresar por medio deheurísticas.
_ El concepto de heurística es difícil de aprehender. Newell,Shaw y
Simon en 1963 dieron la siguiente definición: "Unproceso que puede
resolver un problema dado, pero queno ofrece ninguna garantía de que lo
hará, se llama unaheurística para ese problema".
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 85 de 91
b) Otra heurística, mucho más simple, consiste en contar el número de
casillas que están fuera de su sitio (respecto al tablero objetivo). Es
una heurística más pobre que la anterior, puesto que no usa la
información relativa al esfuerzo (número de movimientos) necesario para
llevar una pieza a su lugar.
fig. 2.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 86 de 91
Se dividen en dos grupos:
_ Los métodos irrevocables que no preven la vuelta a un lugar del
espaciode estados si el camino resulta inadecuado.
_ Los métodos tentativos en los que sí podemos volver hacia atrás si
prevemos que el camino elegido no es el más adecuado.
1.
2.
3.
4.
5.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 87 de 91
TEMA 10. INTRODUCCIÓN A APRENDIZAJE AUTOMÁTICO
10.1 INTRODUCCIÓN
Vivimos un momento en el que cada vez es más habitual escuchar
hablar sobre el aprendizaje automático pero, ¿sabemos realmente
qué es y para qué nos sirve?
El aprendizaje automático, también conocido como Machine
Learning(ML), es una rama de la inteligencia artificial (AI) que
tiene como objetivo desarrollar técnicas que permitan a las
máquinas aprender por sí solas.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 88 de 91
se encuentra la de aprendizaje automático, o Machine Learning
(ML) por su traducción en inglés.
Los algoritmos de ML pretenden que las computadoras aprendan a
tomar decisiones sin la necesidad de ser programadas
explícitamente. Es por ello que hoy en día podemos escuchar
acerca de autos de conducción autónoma, agentes virtuales de
atención al cliente (chatbots), sistemas de recomendación y
recolección de datos (Netflix, Google, Facebook).
Para adentrarnos más al mundo de ML, es importante conocer la
clasificación de sus algoritmos. Dependiendo de las necesidades
del problema, el ambiente en el que se van a desenvolver y los
factores que afectarán la toma de decisiones, podemos encontrar
distintos tipos de algoritmos de aprendizaje, entre los cuales
vamos a hablar de 3 de ellos: supervisado, no supervisado y por
refuerzo.
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 89 de 91
10.2.2 APRENDIZAJE NO SUPERVISADO (Unsupervised machine
learning)
Los algoritmos de aprendizaje no supervisado trabajan de forma
muy similar a los supervisados, con la diferencia de que éstos
solo ajustan su modelo predictivo tomando en cuenta los datos de
entrada, sin importar los de salida. Es decir, a diferencia del
supervisado, los datos de entrada no están clasificados ni
etiquetados, y no son necesarias estas características para
entrenar el modelo. Dentro de este tipo de algoritmos, el
agrupamiento o clustering en inglés, es el más utilizado, ya que
particiona los datos en grupos que posean características
similares entre sí. Una aplicación de estos métodos es la
compresión de imágenes. Entre los principales algoritmos de tipo
no supervisado destacan:
K-medias (K-means)
Mezcla de Gaussianas (Gaussian mixtures)
Agrupamiento jerárquico (Hierarchical clustering)
Mapas auto-organizados (Self-organizing maps)
Profesor Hakim Pergentino Esimi Mbomio Angué Ing. de sistemas Tel: 551 296 103 email: perdupri@gmail.com Facultad de Ciencias Económicas UNGE
Página 90 de 91
Figura 3. Diagrama de flujo del aprendizaje automatico
1.
2.
3.
4.
5.
6.
----------------------------------FIN DE LA ASIGNATURA-----------------------------------
Finalmente quiero decir que tras tantas horas preparando los temas, podría suceder que se
me haya colado algún gazapo, falta de ortografía, e incluso alguna "burrada", ello a pesar de
que antes de confirmar el capítulo siempre he realizado una revisión para hallar este tipo de
cosas; si a pesar de ello encontráis alguno, lo siento de corazón, no ha sido mi intención.
Si queréis enviarme algún correo dando vuestra opinión sobre el curso (qué os ha parecido, si
muy difícil, si opináis que el desarrollo ha sido adecuado, carencias encontradas, y en fin,
sugerencias), no tenéis más que enviarme un correo mediante las direcciones:
perdupri@gmail.com o pergend@yahoo.com
Teléfono de contacto: 551 296 103
Twitter: @DupriPergentino
facebook: H Pergen Dupri