ALGORITMOS Y
ESTRUCTURAS DE DATOS
Mtra. Irma Ardón
[email protected]
http://sites.google.com/site/irmaardon
Objetivos
Resolver problemas que utilicen estructuras y recursión
Implementar ED estáticas y dinámicas
Seleccionar ED, ordenamientos y
búsquedas que resuelvan problemas
específicos
Temario
1.
Tipos de Datos Abstractos y Estructuras Dinámicas
2.
Recursión y Eficiencia
3.
Búsquedas
4.
Ordenamientos
5.
Listas
6.
Árboles
7.
Grafos
Bibliografía
AHO. Estructuras de Datos y Algoritmos. Pearson
SEDGEWICK. Algorthms in C. Addison Wesley
CAIRO. Estructuras de Datos. McGrawHill
Otros Autores: Joyanes, Ceballos, DEITEL &
DEITEL
Internet
Evaluación…
%
1° Parcial 35 2° Parcial 35
Trabajo Final 10
Ejercicios y Programas 20
…Evaluación…
Parciales escritos
Ejercicios en tiempo y forma
Programas. Por correo, en un solo documento (doc o pdf)
código comentado e imágenes
de la ejecución
…Evaluación
Trabajo Final (propuesto por la Profesora o por el grupo)
Por correo, Reporte (doc o pdf) con:
Portada e Introducción. Planteamiento del Proyecto y por qué se eligió
Desarrollo. Código Fuente comentado e imágenes de la ejecución
Conclusiones. Beneficios obtenidos durante el desarrollo del Proyecto, problemas encontrados y cómo se solucionaron
Bibliografía. escrita o electrónica
Equivalencia
NA 0 - 5.9
S 6 - 7.9
B 8 - 8.9
MB 9 - 10
1. TDA Y ESTRUCTURAS
DINÁMICAS
Tipos de Datos…
Básicos. Almacenan un solo valor a la vez
int, float, char, apuntador
…Tipos de Datos…
Estructurados. Almacenan un conjunto de valores de igual o diferente tipo
Arreglos, Estructuras, Listas, Pilas,
Colas, Árboles y Grafos
…Tipo de Dato Abstracto
Datos Estructurados con funciones
definidas para manipular sus valores
Apuntador
Tipo de dato que permite almacenar
direcciones de memoria
En Lenguaje C/C++
Declaración:
Tipo * NomVarPtr;//cada variable con su propio * antepuesto
Inicialización:
NomVarPtr = NULL;
Tamaño en Memoria:
Ocho bytes
Operadores (unarios)
& de dirección. Devuelve la dirección de la variable sobre la cual se utiliza
* de indirección. Devuelve el valor de la variable a la que apunta
si * se utiliza en un apuntador, no o mal inicializado, provoca errores graves:
ciclos infinitos, alteraciones en otros datos, interrupción del programa
Ejemplo. Operadores
int Y=5;
int * YPtr; //YPtr puede almacenar la dirección //de memoria de una variable entera
YPtr= &Y; //YPtr almacena la dirección de la // variable entera Y
*YPtr; //devuelve o manipula el 5 (valor de Y)
Manejo indirecto de un valor
En una variable tipo apuntador, se almacena indirectamente un valor, pues dicho valor no se
almacena en el apuntador pero si en la dirección de memoria contenida en él int a;
int * aPtr;
aPtr = &a;
*aPtr = 520;
aPtr = F3A2
A1 A2 A3 A4…
F1 F3A2 F2
F3 520
F4…
aPtraPtr
aa
Ejemplo. Direcciones y Valores
main(){
int Y=5, * YPtr;
YPtr= &Y;
printf("\nLA DIRECCION DE Y ES %p”,&Y);
printf”(“\nEL VALOR ALMACENADO EN YPtr ES
%p ", YPtr);
printf("\nEL VALOR DE Y ES %d”,Y);
printf(“\nEL VALOR DE *YPtr ES %d ", *YPtr);
printf("\n &*YPtr = %p\n*&YPtr = %p ",&*YPtr,
*&YPtr);
}
Arreglos
Colección de valores todos ellos del
mismo tipo que se almacenan en localidades consecutivas (celdas) en la memoria de la
computadora y bajo un mismo nombre tipo NOMBRE[max_elem];
X[0] = 1.8 lee (X[1]) muestra(X[i])
…Acceso a los valores…
Para acceder a un valor en un arreglo o vector, se utiliza un indicador de posición o índice. En C/C++ y Java, la primera posición
es cero
No se deben exceder los límites del vector, ni
acceder a celdas vacías
…Propiedades
Para recorrer todos los elementos de un vector –i- va de 0 a max_elem –1
Los Vectores o Arreglos tienen:
un nombre
un conjunto de valores todos ellos del mismo tipo
índice o indicador de posición de 0 a MaxElem –1
Estructuras Dinámicas
Solución a la desventaja de los arreglos
Cabeza
DECLARACION DE LOS TIPOS DE
DATOS TNodo Y APUNTADOR A TNodo
struct TNodo{
int Info;
struct TNodo * PtrSig;
};
typedef struct TNodo * TNodoPtr;
Se declara un apuntador a nodo para ubicar un nodo en particular:
TNodoPtr Cabeza, actual, NodoNuevo;
Al insertar un dato nuevo, se solicita memoria para un NodoNuevo
NodoNuevo = new TNodo;
new
Retorna un apuntador a la celda de memoria a partir de la cual se
almacenará el nuevo nodo
Reserva tantos bytes como requiera el
tipo de dato TNodo
delete
Al eliminar un dato, se libera la
memoria consumida por el nodo que lo contiene
delete(actual);
Los apuntadores deben inicializarse en NULL y liberarse con delete al eliminar el elemento al que apuntan o cuando ya
no serán utilizados
NodoNuevo
Cabeza
2.
RECURSIÓN
Técnica de Programación que se utiliza cuando la solución de un problema
implica, repetir la misma funcionalidad un número determinado de veces, cada
vez en menor escala
int factorial (int n){
si (n = = 0) retorna 1
retorna n *factorial (n - 1) }
factorial (4) = 4 * factorial (3) = 4 * 6 = 24
factorial (3) = 3 * factorial (2) = 3 *2 = 6 factorial (2) = 2 * factorial (1) = 2 * 1 = 2
factorial (1) = 1 * factorial (0) = 1 * 1 = 1
Potencia n
k3
2= 3*(3
1) = 3*(3*3
0) = 3*(3*1)= 3*(3) = 9
int potencia (int n, int k) { si (k==0) regresa 1
regresa n * potencia (n, k-1)
}
Características de la Recursión
1.
El problema se resuelve, resolviendo el mismo problema a menor escala hasta llegar al caso “base”
2.
El procedimiento se llama a si mismo
3.
La manera en la cual el tamaño del
problema disminuye asegura que se
llegará al caso “base”
ANEXO MODULARIDAD
Modularidad “Divide y Vencerás”
Dividir el trabajo
Reutilizar código
Fácil comprensión
Fácil mantenimiento
Ejemplo
Cálculo de área y perímetro de un
triángulo
Declaración de Módulos
PROCEDIMIENTO:
1. void Calcula_Area(float base, float altura, float * area) {
2. *area = base*altura/2;
3. }
FUNCIÓN:
4. float Calcula_Perimetro(float base, float altura){
5. float perimetro;
6. perimetro=base*altura;
7. return (perimetro);
8. }
1. int main(){
2. float base,a,perimetro,area;
3. int opc;
4. do {
5. do {
6. cout<<"\n1. AREA\n2. PERIMETRO”<<"\n3. SALIR\nOPCION?
";
7. cin>>opc;
8. }while(opc < 1 || opc > 3);
9. if (opc != 3) {
10. cout<<"\nINGRESE BASE Y ALTURA ";
11. cin>>base>>a;
12. switch (opc) {
13. case 1:Calcula_Area(base,a,&area);
14. cout<<"AREA = " <<area; break;
15. case 2:perimetro=Calcula_Perimetro(base,a);
16. cout<<" PERIMETRO = "<<perimetro;
17. }
18. }
19. }while (opc != 3);
20. }
Llamado
Comunicación entre módulos…
Parámetros de Permiten al módulo invocado
Entrada Llevar a cabo su misión
Salida Comunicar resultados obtenidos Valor
Retornado Comunicar resultados obtenidos
…comunicación
1. void Calcula_Area(float base, float altura, float * area) {
2. *area = base*altura/2;
3. }
4. float Calcula_Perimetro(float base, float altura){
5. float perimetro;
6. perimetro=base*altura;
7. return (perimetro);
8. }
Parámetros de Entrada Parámetro de Salida
Valor Retornado
¿Retornar o No Retornar?
Retornar ahorra un parámetro de
salida
En el llamado y en la declaración los
parámetros
deben coincidir en cantidad, tipo y
secuencia
Ejecución del Programa…
1.
Siempre inicia en main()
2.
Cuando se invoca a un módulo, la ejecución del main() se suspende
3.
Se ejecuta el módulo invocado
4.
Al terminar el módulo invocado, se regresa a main()
5.
Siempre termina en main()
…Ejecución del Programa…
Un módulo puede invocar a otro módulo y así sucesivamente,
pero la aplicación siempre
inicia y termina en main()
Paso de Parámetros…
Por:
Valor. Entradas que no cambian
Referencia a su dirección de memoria.
Salidas que sí cambian
1. void Calcula_Area(float base, float altura, float * area) {
2. *area = base*altura/2;
3. }
4. float Calcula_Perimetro(float base, float altura){
5. float perimetro;
6. perimetro=base*altura;
7. return (perimetro);
8. }
Paso de Parámetros
Los Parámetros de:
Entrada pasan por Valor
Salida pasan por
Referencia con apuntadores