UNIDAD No. 01 Introducción a los conceptos fundamentales de las Estructuras de Datos Autor Silverio Del Orbe Abad. Santo Domingo, D.N. 22-05-2020 Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos INDICE DEL CONTENIDO INTRODUCCION DE LA UNIDAD ......................................................................................................................4 Introducción a los Conceptos Fundamentales de las Estructuras de Datos.......................................................5 1.1 Conceptos básicos y fundamentales. ...........................................................................................5 Software .....................................................................................................................................................5 Ingeniería de software Orientada a Objetos (OO)......................................................................................5 Algoritmos computacionales y crecimiento (Eficiencia). ...........................................................................8 1.2.- Definiciones de las Estructuras de Datos y su Clasificación. ................................................................12 Origen y problemáticas de estudio de las Estructuras de Datos. .............................................................13 Operaciones fundamentales ....................................................................................................................14 1.3.- Clasificación según el uso de memoria ................................................................................................15 Estructura de datos Estáticas: ..................................................................................................................15 Dinámicas: ................................................................................................................................................15 1.4.- Concepto de Tipo Abstracto de Datos (TAD).......................................................................................15 Una plantilla vista en C++, POO, se muestra a continuación....................................................................16 BIBLIOGRAFIA ...............................................................................................................................................18 Bibliografía Consultada: ........................................................................................................................18 Bibliografía Recomendada: ..................................................................................................................18 WEBGRAFÍA ..........................................................................................................................................18 3 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos INTRODUCCION DE LA UNIDAD Las Estructuras de Datos, eje fundamental de todo Sistema de Información, permiten que los datos se organicen, almacenen y manipulen con altos estándares de calidad. Por esto en esta unidad estudiaremos conceptos, tipos, categorías y las operaciones que permitan su manipulación. En esta unidad haremos un breve recuento de conceptos fundamentales de la programación orientada a objetos (POO), metodología que permite representar la estructura de datos mediante tipos abstractos de datos (TAD) de una forma sencilla y dinámica. La POO la cual abstrae objetos o elementos de la naturaleza (Procesos, personas, acciones, cosas, etc.) con sus características y comportamientos; conectan, por ejemplo, de manera ideal con las características de las Estructuras de Datos, sus modelos matemáticos o restrictivos y las operaciones que le permiten manipular. Las Estructuras de Datos, son conjuntos o colecciones organizados de datos, los cuales guardan reglas de organización y control. Las mismas se clasifican según manejen las memorias en estáticas y dinámicas, lineales o no lineales. En esta unidad veremos en detalle en qué consisten dichos tipos y su diferenciación. Al cierre de esta unidad representaremos Estructuras de datos (TAD) mediante un lenguaje de programación POO: Diagrama, Código y escenarios de unidad de prueba (unit testing). 4 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Introducción a los Conceptos Fundamentales de las Estructuras de Datos 1.1 Conceptos básicos y fundamentales. Software Según la IEEE1 “software es la suma total de los programas de ordenador, procedimientos, reglas, la documentación asociada y los datos que pertenecen a un sistema de cómputo" y "un producto de software es un producto diseñado para un usuario”2. De ahí que las Estructuras de Datos son piezas esenciales para construir software, conocer sus características, como modelarlas y aplicarlas, es la primera tarea para que dicho software funciones de manera eficiente y con altos estándares de calidad. Al construir software hay que hacer especial énfasis en la calidad y composición de las estructuras de datos. Igual elegir un paradigma que permita su representación de forma dinámica y eficiente. La ingeniería de software dedica gran parte de esfuerzo a la calidad de los datos a manipular. Ingeniería de software Orientada a Objetos (OO). La ingeniería de Software OO dirige todos los pasos de la producción del software mediante el paradigma de la orientación OO, en la cual debe determinar encapsular objetos mediantes Clases (Class), Atributos y sus comportamientos. También determina como estas Clases interacción con otras del contexto. Recomendamos que instale un IDE avanzado en POO y C++. Eclipse, Netbean, Visual Studio, Etc.. Todos los ejemplos y prácticas de este curso serán en C++. En una vista más amplia, la ingeniería de software se preocupa por metodologías incrementales las cuales abolieron el modelo secuencial histórico3. Dichas metodologías incrementales hoy día se han solidificado y se fundamentan en métodos Agiles4, los cuales integran desarrollo, seguimiento (SCRUM5), entrega continua y gestión de la calidad activamente (Unit Test6). Para los propósitos de este curso nos enfocaremos exclusivamente en las conceptos y características OO que nos permitan representar TAD. 11 https://www.ieee.org/ https://es.wikipedia.org/wiki/Software#cite_note-7 3 https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/el-modelo-en-cascada/ 4 https://www.agilealliance.org/agile101/ 5 https://www.scrum.org/resources/what-is-scrum 6 https://es.itpedia.nl/2018/11/21/test-driven-development-tdd-in-een-agile-omgeving/ 2 5 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Principales definiciones de la Orientación a objetos (OO) 1. El Objeto: es el eje o nombre que recibe la unidad mínima de la POO. Se conoce, desde el punto de vista de la programación, como una instancia (variable) de clase (type) en memoria. 2. Una Clase (Classification/Groupping): Es el Código que se utiliza para representar los objetos en el lenguaje. Se conoce como plantilla, que encapsula los datos con el código que lo transforma, ocultando los elementos de información que no son necesario exponer públicamente. Está compuesta por método y propiedades (atributos o estado del objeto). Las mismas pueden ser concreta o abstracta. Las abstractas no permiten construcción y se manifiestan mediante hijos. Las propiedades: son las características que definen el objeto (atributos) que lo identifican y diferencian de cualquier otro objeto. Los Métodos, Son las funciones u operaciones que regulan el comportamiento el objeto. Estos aceptan sobrecarga y dan gran estabilidad a su firma (lista de parámetros formales). Pueden ser Constructores, de Acceso (Getters), de cambios o mutadores (Setters/mutators) y de operación del objeto (cálculos/cómputos). Estos permiten la so En su cuerpo, las clases manejan una serie de modificadores, que hacen los elementos de dicho código bien dinámicos y estructurales: 1. Modificadores de acceso: private, public, protected. Los cuales contralan el uso de las variables y funciones, una vez las clases son instanciadas. Solo los public son de libre acceso y los protected dentros de los hijos. private son exclusivo dentro de la clase. 2. static se accede (consume) sin la necesidad de instancia y consumen memoria desde inicio (desde que entran en un contexto). 3. Operadores de herencia o jerarquía e implementación de interface. 4. Delegados y eventos (manejo avanzado de punteros a funciones). *** Las Clases, desde el punto de vista de la programación, son tipos de datos compuestos, definido por el programador, que incorporan variables y funciones, los cuales actúan sobre una misma naturaleza. 3. Abstracción: como analizar y descubrir objetos (sustantivos gramaticales) y pasarlos a un lenguaje de computación. 4. Encapsulación: función de datos + Código. Provee ocultamiento de información mediante los modificadores de Acceso. 5. Modularidad: división armónica de los elementos del programa. 6. Complejidad: La POO permite hacer representaciones (solucionar problema) complejas de una forma simple, mantenible y con estándares de calidad. 7. Identidad: Cada objeto es propio y único. Posee características que lo diferencia de los demás 8. Notificación: Los objetos tienen varias formas de comunicarse. La normal mediante instancia y paso de mensaje mediante los métodos. Así también existen forma avanzada de comunicación entre los objetos mediantes eventos y manejo avanzado de delegados. 6 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos 9. Operaciones/Method: son el eje algoritmo de la POO. Tienen tipo de retorno, nombre y firma que acepta sobre-carga. 10. Polimorfismo: es la capacidad que tienen los objetos de adquirir múltiples formas o comportamiento, mediante herencia y sobrecarga de funciones. Se escenifica a plenitud con las clases abstractas e interfaces. Gran utilidad para estandarizar los hijos y en puntos estratégicos representarlos como un padre. Los hijos especializan características del padre mediante la sobreescritura (override). 11. Sobre-Carga (function and Operator): permite que un mismo nombre de función reciba diferente tipos de parámetros (en Datatype y cantidad). También un operador (mat o de relación) puede actuar diferente en base al tipo de dato que recibe. Puede ser por Operador incluso. 12. Relación de Clase: Las Clases forman un ambiente natural de la problemática o área que automatizan. Por ello se relacionan de varias formas: Como Padre e hijo: la cual se llama Herencia. También se conoce como jerarquía. Como Interface: Una clase adquiere de otra interface, lo cual le obliga tener todas las características y métodos públicos, planteado por la interface padre. Asociación: una clase declara una o varias instancias de otra clase. La clase que declara se llama cliente y la de referencia server. Composición: una clase declara propiedades públicas de otra clase. 13. Herencia o Generalización: Una clase adquiere todas las características de una clase Padre. La idea es programar en varios niveles y pasar de un ambiente genérico a uno especializado (De lo General a lo Particular). El término gramatical es-un, debe pronunciarse siempre en la relación: Camión esun Transporte, Triangulo es-un Figura-GEO. 14. Colector de basura: Dentro de los entornos modernos que gestionan los objetos en tiempo de ejecución, se crea un colector de basura (Garbage Collector), el cual elimina todos los objetos en desuso para optimizar el consumo de memoria (RAM). 7 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Grafica 1.1 ilustración de un modelo OO geométrico Este grafico muestra visión ampliada de un modelo geométrico. En la jerarquía todos los dependientes (hijos) hablan el idioma (dialogo o interface): Lados, Áreas, Perímetro y tipo, características suficientes para definir cualquier figura geométrica. Algoritmos computacionales y crecimiento (Eficiencia). Los algoritmos computacionales son una secuencia lógica de pasos que permiten solucionar un problema mediante un computador. Sus principales características son: Determina bien el objetivo u horizonte a seguir. Es secuencial y ordenado. Define la memoria necesaria para alcanzar el objetivo a. De entrada o variables independientes. b. De cómputo o solución del objetivos. Hace los movimientos lógico esperados: a. Asignación de RAM. b. Demanda de CPU matemática y lógica. c. Posee la conjunción si (IF) y otras variaciones para la lógica (ALU). d. Repite procesos de manera finitas (Iteraciones) para lograr el objetivo: for loop, while, do while. 8 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Presenta los resultados o solución del problema. Cuando enfocamos los algoritmos desde la perspectiva de las Estructuras de Datos, nos centramos en el procesamiento de iterativos o funciones que se repiten un número determinado de veces. El gran rol de las estructuras de datos es disponer algoritmos consistentes que manejen grandes volúmenes de datos, de una manera eficiente y que utilicen la menor cantidad de memoria y CPU posible (sobre todo enfatizando en optimizar el uso del CPU en los procesos iterativos). El enfoque algorítmico, dentro del contexto de las estructuras de datos, busca construir algoritmos óptimos para colocar las ocurrencias de datos en la colecciones y encontrar los métodos de acceso (búsqueda y ordenamiento) más efectivos. Siempre se enfocan en bajar el tiempo de respuesta y que dichos algoritmos sean capaces de manejar altos volúmenes de datos en memoria, consumiendo el tiempo mínimo para realizar cualquieras de las operaciones elementales con estos (Alta, baja, búsquedas y ordenamiento). Se dice que O(f(n)) define un "orden de complejidad". Escogeremos como representante de este orden a la función f(n) más sencilla del mismo. Así tendremos: O(1): Orden constante O(log n): Orden logarítmico O(n): Orden lineal O(n log n) Orden lineal y logarítmico O(n^2): Orden cuadrático O(n^a): Orden polinomial (a > 2) O(a^n): Orden exponencial (a >= 2 ^ n > 1) O(n!): orden factorial El enfoque matemático más apadrinado dentro de Estructura de datos, es el cambio de modelos polinomiales (en cualquier grado) a modelos logaritmos. Recordar que si una función polinómica la puedo cambiar a logarítmica, la misma mientras más grande sea la población o colección de datos, más eficiente será (Log es una función inversa a la potenciación). En una próxima unidad (unidad 4) se detallara este tema. Para cerrar: Un algoritmo se considera óptimo, cuando el mejor y peor escenario de ejecución tiende al menor polinomio posible, para su ejecución en cuanto a consumo de CPU y alojamiento de memoria. Y su rendimiento no se degrada por el crecimiento de la población o colección de datos. 9 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Tabla 1.1 Modelo de programación lineal y Estructurada (Caso punto en el plano o el espacio). POL- Lineal o Secuencial main() { float x,y,z; cout<<"Entre Los Catectos:"; cout<<"C1="; cin>>x; cout<<"C2="; cin>>y; z=x*y; cout<<"EL PRODUCTO ES:"<<z; cout<<"EL AREA ES:"<<z/2.0; } POE- Orientada a Estructuras y Funciones //-ESTRUCTURA DE DATOS struct Punto{ float Abscisa; // X float Ordenada; // Y } /*PROTOTIPO DE FUNCIONES O INTEFACES*/ float getProducto(Punto p_Point); float getArea(Punto p_Point); float getDistancia(Punto p_Point1,Punto p_Point2); main(){ Punto unPoint; /*tipo definido por el programador*/ cout<<"Entre Los Catectos"; cout<<"C1="; cin>> unpoint.Abscisa; cout<<"C2="; cin>>unpoint.Ordenada; cout<<"EL PRODUCTO ES:"; cout<< getProducto(unpoint); cout<<"EL AREA ES:"; cout<<getArea(unpoint); }/* fin*/ /*implementacion DE FUNCIONES - Cuerpo*/ float getProducto(Punto p1){ return p1.Abscisa*p1.Ordenada; } float getArea(Punto p1){ return p1.Abscisa*p1.Ordenada/2.0; } float getDistancia(Punto p1, Punto p2){ /*formula de la hipotenusa para hallar la dist.*/ return sqrt(pow((p2.Abscisa - p1.Abscisa),2) + pow((p2.Ordenada p1.Ordenada),2)); } 10 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Tabla 1.2 Modelo de Orientada a Objetos (POO) “Caso punto en el plano o el espacio”. POO- Orientada a objetos Class Consumidor o Instancia Class Interface Class Implementación //------ header file Punto.h (1) //====================== ========= #pragma once class Punto{ private: float AbscisaX; float OrdenadaY; float TerceraDim; public: Punto(void); Punto(float x, float y, float z); Punto(float x, float y ); Punto operator*(Punto B); ~Punto(void); float getHipotenusa(); void MoverTo(float x, float y); void Mover(float xplus, float yplus); // GETTERS --float getX(); float getY(); float getZ(); };/*fin class interface*/ /* CONSTRUCTORS CPP—implement Punto.cpp (2) */ #include "StdAfx.h" #include "Punto.h" // CONSTRUCTORS Punto::Punto(void){ AbscisaX=0; OrdenadaY=0; TerceraDim=0;} //---> destroy Punto::~Punto(void){} Punto::Punto(float x, float y, float z){ AbscisaX=x; OrdenadaY=y; TerceraDim=z; } Punto::Punto(float x, float y ){ AbscisaX=x; OrdenadaY=y; TerceraDim=0; } // METHODS .... float Punto::getHipotenusa(){ return sqrt(pow(AbscisaX,2)+pow(OrdenadaY,2)+pow(Terc eraDim,2)); } void Punto::MoverTo(float x, float y){ AbscisaX = x; OrdenadaY = y; } void Punto::Mover(float xplus, float yplus){ AbscisaX+=xplus; OrdenadaY+=yplus; } Punto Punto::operator*(Punto B){ Punto C = Punto(getX()+B.getX(), OrdenadaY+B.getY(),TerceraDim+B.getZ()); return C; } float Punto::getX(){ return AbscisaX;} float Punto::getY(){+C11 return OrdenadaY;} float Punto::getZ(){ return TerceraDim;}//--- Fin //================================= ===== //---- CONSUMO /* oocpp.cpp: define el punto de entrada de la aplicación de consola. */ static void main(){ Punto U; float x,y; int intInput =0; do{ cout<<"Entre X:"; cin>>x; cout<<endl<<"Entre Y:"; cin>>y; U = Punto(x,y); // consturctor cout<<"Hipotenusa"<<U.getHipotenusa(); cout<<"Continue?[0=>No,1=>Si]"; cin>>intInput; }while (intInput > 0); return ; } 11 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos 1.2.- Definiciones de las Estructuras de Datos y su Clasificación. Una estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima unidad que se tiene en un sistema. Wikipedia narra, “En ciencias de la computación, una estructura de datos es una forma particular de organizar datos en una computadora para que puedan ser utilizados de manera eficiente. Diferentes tipos de estructuras de datos son adecuados para diferentes tipos de aplicaciones, y algunos son altamente especializados para tareas específicas.7” Datos Datos: Proviene de atributos u oraciones gramaticales. Cuando se abstrae en lenguaje de computación se convierte en Campo, está compuesto por un vector de factores (ID-RAM-HEX, VALUE, DataType, Length). En fin es nuestro gran inicio de estructura de datos, donde el compilador comprueba tipo en tiempo de compilación y cuida en data-value en tiempo de ejecución run-time. De este pasamos al concepto de records, los cuales son las líneas que residen en los archivos o un conjunto de (https://sites.google.com/site/basededatosadsi/time-tracker) atributos de un mismo tema o propósito. Los Datos, son un el conjunto básico de hechos referentes a una persona, cosa o transacción. Incluyen cosas como: tamaño, cantidad, descripción, volumen, tasa, nombre o lugar. (Murdick: pág 157). Características de las Estructuras de Datos. Están compuestas por campos, o la unidad que representa el dato. Tienen esquema de ordenamiento que permite su fácil acceso y organización. Los atributos, son organizados comúnmente en registros, los cuales a través del tiempo han sido estudiados para mejorar su correlación o enlace. Operaciones Básicas Una estructura de datos define la organización e interrelación de estos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son: Alta, adicionar un nuevo valor a la estructura. Baja, borrar un valor de la estructura. Búsquedas, encontrar un determinado valor en la estructura y recuperarlo. La forma básica de hacerlo es secuencial (de extrema deficiencia). Para mejorar este proceso se emplean 7 https://es.wikipedia.org/wiki/Estructura_de_datos 12 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos métodos matemáticos de aproximación o intervalos, siendo el binario o bisección el más empleado y útil. Otras operaciones que se pueden realizar son: Ordenamiento, de los elementos colocados en la estructura de datos, con el estándar UNICODE (ASCII) O el peso del alfabeto. Apareo o relación, dadas dos estructuras generar una nueva ordenada y que contenga a las relacionadas o partes de estas. Muy de la mano de la matemática de conjuntos (Unión, diferencia, Intercepción, inyección, bisección, conjunto producto, producto natural, Etc. 8). Origen y problemáticas de estudio de las Estructuras de Datos. En computación, los primeros sistemas estables de almacenamiento eran los TAPE (Cintas Magnéticas9). De ahí que acceder a los datos registrado en las mismas era obligatoriamente de forma secuencial y los records eran alojados con longitud fija. Normalmente para recuperar dichos datos se tardaba mucho tiempo y en muchos casos los mismo se corrían de lugar (solapaban). Ver este ejemplo: Registro definido a nivel de programación en los 60s (Cobol o RPG): longitud fija. id name fecha actividad categoría ~1-5 ~6-25 ~26-35 ~36-50 ~51-70 longitud = 70 caracteres Posibles dados a almacenar (escenario): Apolo 6563 05/06/1969 Lanzamiento 11 Creación del Primer sistema 657812 UNIX 16/16/1969 Operativo Astronautas Ciencia de la Computación Análisis de longitudes 4 6 8 4 12 12 11 37 11 25 El primer record entra sin problema en el sistema, pero el segundo violenta varias reglas de tamaño. Esta problemática provoco la búsqueda de alternativas para que los datos fuesen manipulados sin estas inconsistencias. Este estudio se basó en los siguientes enunciados: 8 9 Los datos tienen que mantener su calidad e independencia, independiente del programa que acceda a estos. https://es.wikipedia.org/wiki/Operaciones_con_conjuntos https://es.wikipedia.org/wiki/Cinta_magn%C3%A9tica 13 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos La longitud y el tipo de datos debe estar garantizado en todo momento, durante su manipulación. Inclusive ser extendido a la complejidad de campos tipos fecha. Datos repetitivos deben ser almacenado de forma única y con el costo mínimo de almacén. No redundancia de información. Se deben crear índices binarios para acelerar la búsqueda. Dependiendo de uso o aplicación de los datos, se deben crear modelos matemáticos para controlar su acceso y efectividad. Los objetivos fundamentales de las Estructuras de Datos son: 1. Identidad del dato (cada datos o record es único frente a sus iguales). 2. Garantizar la integridad de los datos (tipo, longitud y calidad). 3. Acceso con celeridad y consistencia. 4. La concurrencia y gestión de volúmenes. 5. La relación o apareo de los datos. 6. Aplicar modelos matemáticos a esto, dependiendo el campo de aplicación. Operaciones fundamentales Altas: Permiten agregar un record o ocurrencia a la estructura de datos. Normalmente al pie del arreglo (array). Ej. Sea E[n] el vector de los elementos, E[n-1] Frutas = altavalor; // altavalor=”granada”. Mango Bajas: Elimina un elemento de la colección. Normalmente el ultimo. Debe Guayaba recomponer el array a la dimensión n-1. Ej: en este caso saldría “granada” y quedan Aguacate 5 ocurrentes/frutas. Coco de Agua Búsquedas: ubicar un elemento en la lista. Ej: “Coco de Agua” indica encontrado. Lechoza ”Zapote” no encontrado. Ordenamiento: Ubicar los elementos en orden entendible o útil para el propósito Granada aplicado. Lo más común es el alfabético y el numérico. Pero hay algoritmos con otro grado de inteligencia, que los colocan con oportunidad para dar la mejor respuesta (tipo arboles). Hay modelos matemáticos cerrados, que impiden la búsqueda abierta como LIFO (Last In First Out) y FIFO (First In First Out). Frutas'Alfa Reacomodamiento de memoria: Cada vez que la estructuras sufre altas o bajas orden (cambios), debe redimensionarse la memoria RAM. Para que esto sea más óptimo, se requiere de algoritmos basado en estructuras dinámicas y expandible (pasar de lo Aguacate estático a lo dinámico y de lo dinámico lineal a lo dinámico no-lineal). Esta utilidad la Coco de Agua obtendremos con los modelos OO y relaciones entre los objetos. Granada Persistencia en disco: el proceso de las Estructuras de Datos es manejado de forma Guayaba abstracta en la memoria (RAM) y una vez los procesos de altas o bajas son Lechoza comprobados en la misma, los mismos deben ser asentados en medios Mango permanentes. Todas las operaciones se hacen en RAM, pero es mandatorio que los mismo sean persistente en el tiempo. Los motores de base datos (DBMS) vigilan y controlan que no se llegue a los archivos por otras vías. Todas las peticiones se hacen vía el motor, para que este aplique todos los esquemas de comprobación en memoria. 14 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos 1.3.- Clasificación según el uso de memoria Estructura de datos Estáticas: Consumen la misma cantidad de RAM alocada desde tiempo de compilación. En este grupo se encuentran las variables primitivas, los arreglos con longitud fija y los registros. Listamos las principales: Tipos primitivos: enteros, flotantes, booleano, String, records, Array (1 o n dimensiones). https://cristinapalacios1309.jimdofree.com/estruct uras-de-datos-2a-y-2b/ Dinámicas: Se Alojan en tiempo de ejecución (run-time), la memoria necesaria. También estas estructuras de datos tienen un modelo matemático que le acompaña y regula la forma en que se organizaran y manipularán los datos. Su soporte inicial son los arreglos dinámicos. De forma avanzada los arreglos son gestionados mediante TAD y punteros de memoria, para mayor eficiencia. Para que una estructura dinámica funcione debe estar encapsulada dentro de un tipo de datos abstracto (TAD). Citamos las principales estructuras de datos dinámicas: Lineales: los elementos dispuestos uno a continuación del otro. Listas enlazadas, Pilas y Colas. Las listas enlodadas se subdividen en 3 tipos: simple, doble y circulares. Así también las Colas tiene dos sub-tipos principales: Cola y Cola de prioridad. No Lineales: la forma de colocación depende criterios algorítmicos o cercanía geografía u otras relaciones. Dentro de estas las principales son Arboles binarios (aplicado a búsqueda) y grafos (aplicado a transporte o geografía). Base de datos y archivos: Son los repositorios finales de los datos manipulados en memoria. En el caso de un motor de base de datos (DBMS) tiene integrado las estructuras de datos y los algoritmos que garanticen su integridad y calidad. 1.4.- Concepto de Tipo Abstracto de Datos (TAD). Un TDA es un modelo matemático con una colección de operaciones definidas sobre el modelo” (Aho, Hoperoft y Ullman. “Fundamental Structures of Computer Science”,1981). “Una clase de objetos definida por una especificación independiente de la representación“ (Guttag “Abstract Data Type and development of data structures “ ACM . Vol 20-6, 1977). “Es un tipo de dato definido por el usuario a través de una especificación y una implementación de los objetos abstractos”. (Rowe , “types” ACM sigplan, Vol 16-1, 1980). 15 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos Un TDA es un tipo de dato definido por el programador para representar una entidad (abstracción) a través de sus características (datos o atributos) y sus operaciones o funciones (algoritmos que manipulan los datos, Hilda Contreras). En sentido práctico y de computación, un TAD es un es un tipo objeto, encapsulado mediante una clase, el cual cumple con la interface TAD (-E*, Dim; +Alta(); +Baja(); +Buscar()). Cualquier TAD debe tomar esta forma: *E: Es la cantidad de todos los elementos. Dim: la cantidad de elementos colocados en el array. Constructor vacío. Alta(): Agregar un elemento a la estructura E. Baja(): Retirar un elemento de la estructura E. Buscar(): Localizar un elemento. Una plantilla vista en C++, POO, se muestra a continuación. Caso práctico, para ir aplicando los conceptos de tratados en esta unidad. /*MS VC++ TAD.h*/ #pragma once using namespace std; class TAD{ private: string *E; int Dim; /*Cantidad*/ void copyData(string *acpy, int start, public: TAD(); ~TAD(); void Alta(string x); string Baja(); //overload 1 de baja string TAD::Baja(int posicion); string Buscar(string x); }; /*IMPLEMENTACION. PREFERIBLE EN UN CPP TAD.cpp*/ #include "stdafx.h" #include "TAD.h" TAD::TAD(){ this->Dim = 0; } TAD::~TAD(){ delete E; } void TAD::Alta(string x){ // por cada alta hay que volver a resim el E string *acopy = E; Dim++; int end, short int paralel); 16 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos this->E = new string[Dim]; copyData(acopy, 0,Dim-1, 0); this->E[Dim - 1] = x; // nueva alta en posicion n-1 } void TAD::copyData(string *acpy, int start, int end, short int paralel){ for (int k = start; k < Dim; k++) this->E[k] = acpy[k+paralel]; } string TAD::Baja(){ // por cada alta hay que volver a resim el E string *acopy = E; string bajado = acopy[Dim - 1]; // retira el ultimo Dim--; this->E = new string[Dim]; copyData(acopy, 0, Dim,0); return bajado; } string TAD::Baja(int posicion){ // por cada alta hay que volver a resim el E if (posicion < 0 || posicion > Dim - 1) return NULL; string *acopy = E; string bajado = acopy[posicion]; Dim--; this->E = new string[Dim]; copyData(acopy, 0, posicion, 0); copyData(acopy, posicion+1, Dim+1, 1); return bajado; } string TAD::Buscar(string delta){ // por cada alta hay que volver a resim el E string buscado = NULL; for (int k = 0; k < Dim; k++) if (E[k] == delta) buscado = E[k]; return buscado; } En el ejemplo anterior observamos una típica implementación de un TAD esta dar en C++. Cada vez que hay un cambio en la estructura se debe recomponer el array E. Según progrese el curso, veremos técnica para evitar tener que estar redimensionando el array continuamente. 17 Autor/a: Silverio Del Orbe Abad. Unidad 01: Introducción a los conceptos fundamentales de la Estructura de Datos BIBLIOGRAFIA Bibliografía Consultada: Applied data structures with C++, Peter Smith, 2004. Weiss, M. A. (2000). Estructura de datos en JAVA. Joyánes, L. (2007). Estructura de datos en JAVA. Villa Z., D. A. & otros. (2008). Introducción a las Estructuras de datos en JAVA. Lewis, J. & Chase, J. (2006). Estructura de Datos con Java –Diseño de Estructuras y Algoritmos. Bibliografía Recomendada: Villa Z., D. A. & otros. (2008). Introducción a las Estructuras de datos en JAVA. Lewis, J. & Chase, J. (2006). Estructura de Datos con Java –Diseño de Estructuras y Algoritmos. Applied data structures with C++, Peter Smith, 2004. WEBGRAFÍA https://www.educba.com/data-structures-and-algorithms/ https://es.wikipedia.org/wiki/Estructura_de_datos https://es.wikipedia.org/wiki/Operaciones_con_conjuntos https://es.wikipedia.org/wiki/Cinta_magn%C3%A9tica https://www.ieee.org/ https://es.wikipedia.org/wiki/Software#cite_note-7 https://www.ionos.es/digitalguide/paginas-web/desarrollo-web/el-modelo-en-cascada/ https://www.agilealliance.org/agile101/ https://www.scrum.org/resources/what-is-scrum https://es.itpedia.nl/2018/11/21/test-driven-development-tdd-in-een-agile-omgeving/ 18 Autor/a: Silverio Del Orbe Abad.