Pproblema de redes de amistad “Friendship Networks” se refiere a la manera de verificar si una red de amigos está bien construida de tal manera que el primer número de la cadena de enteros diga la cantidad de redes de amistad bien construidas suponiendo que la persona no se podrá ser amigo de sí misma.
Fundamentos de Analisi y Diseño de Algoritmos FADA
1. PROYECTO FINAL
FADA
Fundamentos de Análisis y Diseño de Algoritmos.
PRESENTADO A:
Mauricio López Benítez
José Luis Dorado.
Juan Camilo Solarte.
Andrés Felipe Trochez.
Universidad del Valle Sede Norte del Cauca.
Santander de Quilichao.
Diciembre 15 del 2015.
2. Tabla de contenido Pág.
1. INTRODUCCION.....................................................................................................................2
2. PLANTEAMIENTO DEL PROBLEMA. .................................................................................3
3. EJECUCION DEL TRABAJO.................................................................................................4
3.1. Estructura de Datos.........................................................................................................4
3.2. Técnicas de Programación.............................................................................................8
3.3. Tiempo de Ejecución.......................................................................................................8
4. ANEXOX....................................................................................................................................10
3. 1. INTRODUCCION
El presente problema de redes de amistad “Friendship Networks” se refiere a la
manera de verificar si una red de amigos está bien construida de tal manera que el
primer número de la cadena de enteros diga la cantidad de redes de amistad bien
construidas suponiendo que la persona no se podrá ser amigo de sí misma.
Teniendo en cuenta todo esto se recurrió a técnicas de solución algorítmicas ya
conocidas como algoritmo de heapsort-modificado, Teorema de Havel-Hakim,
además de la GUI de java, arreglos “arraysList”, ciclos “while, for” condicionales “if-
else”.
5. 3. EJECUCION DEL TRABAJO.
3.1. Estructura de Datos.
Para el desarrollo del problema de la maratón nacional de
programación se utilizaron las siguientes estructuras de
programación, lenguaje de programación JAVA, Teorema de
Havel-Hakim y algoritmos de ordenamiento.
JAVA
Java es un lenguaje de programación de propósito
general, concurrente, orientado a objetos que fue diseñado específicamente
para tener tan pocas dependencias de implementación como fuera posible.
Su intención es permitir que los desarrolladores de aplicaciones escriban el
programa una vez y lo ejecuten en cualquier dispositivo (conocido en inglés
como WORA, o "write once, run anywhere"), lo que quiere decir que
el código que es ejecutado en una plataforma no tiene que
ser recompilado para correr en otra
Interfaz Gráfica GUI
Llamamos Interfaz Gráfica GUI (Graphical User Interface) al conjunto de
componentes gráficos que posibilitan la interacción entre el usuario y la
6. aplicación. Es decir ventnas, botones, combos, listas, cajas de diálogo,
campos de texto, etc.
Primero tenemos que diseñar la aplicación,programarla y por último los
eventos que se generan a medida que el usuario interactua con la Interfaz.
Los componentes son objetos de las clases que heredan de la clase
base componente como Button, List, TextField, TextArea, Label, etc.
En una GUI los componentes son contenidos en Contenedores o containers.
Un Containes es un objeto cuya clase hereda de Container (clase que a su
vez es subclase de Component) y tiene la responsabilidad de contener
Componentes.
Generalmente una GUI se monta sobre un Frame. Esté sera el Container
principal que contendrá a los componentes de la Interfaz Gráfica, un
Container podría contener a otros containers
Arreglos.
ArrayList: La clase ArrayList en Java, es una clase que permite almacenar
datos en memoria de forma similar a los Arrays, con la ventaja de que el
número de elementos que almacena, lo hace de forma dinámica, es decir,
que no es necesario declarar su tamaño como pasa con los Arrays.
Bucles.
While: bucle mientras es una estructura de la mayoría de los lenguajes
de programación estructurados cuyo propósito es repetir un bloque de
código mientras una condición se mantenga verdadera.
For: ciclo for es una estructura de control en la que la PC nos muestra el
cómo programar si es que nosotros queremos programar un robot B-bot,
en este se puede indicar el modo en la que se puede indicar el número
mínimo de iteraciones.
Condicionales.
7. If-else: se da una condición y si la misma se cumple ejecuta un código X,
en caso de que no se cumpla, ejecuta otro código Y (distinto).
Teorema de Havel-Hakim.
Consiste en ordenar los grados en forma decreciente, tomar el primer
elemento de la secuencia, y usarlo para restar de a 1 a cada uno de los
siguientes (obviamente, lo descartas). Si quedas con 0, es porque es una
secuencia válida de grados
Por ejemplo: 2, 2, 2, 1, 1, 3, 3, 4.
1. Los ordenamos
4, 3, 3, 2, 2, 2, 1, 1
2. Mientras hay algún número mayor que 0, restamos del modo
mencionado y descartamos el primero:
4,3,3,2,2,2,1,1 →"repartimos “el 4 para restar→ (3-1),(3-1),(2-1),(2-1),2,1,1
2,2,1,1,2,1,1 → ordenamos → 2,2,2,1,1,1,1
2,2,2,1,1,1,1 → (2-1),(2-1),1,1,1,1
1,1,1,1,1,1
1,1,1,1,1,1 → (1-1),1,1,1,1
1,1,1,1 → (1-1),1,1
1,1 → (1-1)
0
Algoritmo de Ordenamiento.
Heapsort: La estructura de datos Montículo es un arreglo de objetos que
puede ser visto como un árbol binario con raíz, cuyos nodos pertenecen
a un conjunto totalmente ordenado, y tal que cumple las siguientes dos
propiedades:
Propiedad de orden: La raíz de cada subárbol es mayor o igual que
cualquiera de sus nodos restantes.
8. Propiedad de forma: La longitud de toda rama es h o h − 1, donde h
es la altura del árbol. Además, no puede existir una rama de longitud
(h) a la derecha de una rama de longitud h-1.
El algoritmo HeapSort:
1 Build-Heap (A)
2 For i ← length[A] down to 2
3 do exchange A[1] ↔ A[i]
4 heap-size [A] ← heap-size [A] − 1
5 Heapify (A, 1)
La información es almacenada de manera que al recorrer un camino desde la raíz
hacia las hojas, los datos se encuentran en orden descendente
Consta de dos etapas:
o Etapa 1: Se organiza el arreglo como un árbol Heap Máximo.
o Etapa 2: Se ubican los elementos en su lugar definitivo, devolviendo
la propiedad del Heap Máximo en cada ocasión.
9. 3.2. Técnicas de Programación.
Para el desarrollo del problema de la maratón nacional de programación se optó
por una programación voraz.
Programación Voraz.
Un algoritmo voraz toma decisiones con rapidez sobre vistas locales ->
toma decisiones óptimas locales. Espera que llegue a una solución óptima
global
Un algoritmo voraz no siempre encuentra la solución óptima global.
3.3. Tiempo de Ejecución.
Análisis de Heapify:
El tiempo de ejecución de Heapify se puede describir por la ecuación de
recurrencia:
T(n) ≤ T (2n/3) + θ (1)
Θ (1) para calcular el mayor + Heapify con 2/3 de los elementos en el peor de los
casos donde n es el número de nodos del árbol.
Por el método maestro:
T(n) ≤ T (2n/3) + θ (1) = O(n^0 lg n) = O (lg n)
Análisis de Build-Heap:
Sencillo
o Cada llamada a Heapify cuenta O(lg n)
o Se hacen O(n) llamados
10. o Costo total Estimado O(n lg n)
o O(n) es una estimación más precisa
Análisis de HeapSort:
O(n) + (n - 1) O (lg n) = O(n lg n)