son implementados en
En ciertos casos
En ciertos casos

ALGORITMOS Y ESTRUCTURA DE DATOS II

Datos Elementales

Estáticos

Dinámicos

Datos Estructurados

Estructura de datos: organización de datos en un conjunto con relaciones bien definidas. Pueden ser anidadas. Estos datos pueden ser:

Numéricos

Decimales

Enteros

Caracter

char

String

Lógico

Booleanos

float

double

int

byte

short

long

Indican verdad o falsedad (true o false)

Intervalo : [-2^31 ... (2^31)-1]

Tamaño en disco: 4 byte

int nombreDato = 11;

Intervalo : [-128 ... 127]

Tamaño en disco: 8 bits

Intervalo : ['\u0000' .. '\uffff'] o [0 .. 65.535]

Tamaño en disco: 2 byte

Conjunto de caracteres, se puede implementar de la siguiente forma (java):

String nombreDato = " cadena ";

Intervalo : [-2^63 ... (2^63)-1]

Tamaño en disco: 8 byte

Intervalo : [-32,768 ... 32,767]

Tamaño en disco: 2 byte

Tamaño en disco: 8 byte

Tamaño en disco: 4 byte

long nombreDato = 12123;

char nombreDato = ' - ';

byte nombreDato = 1;

float nombreDato = 12,5 ;

double nombreDato = 0,13345;

boolean nombreDato;

nombreDato = true;

nombreDato = false;

Vectores o Arreglos unidimensionales

Intervalo : [±1,7·10^(-308) .. ±1,7·10^308]

Intervalo :[±3,4·10^(-38) .. ±3,4·10^38]

short nombreDato = 12;

Matrices o Arreglos bidimensionales

Poliedros o Arreglos multidimensionales

Grafos

Árboles

Colas

Listas enlazadas

Pilas

Arrays o Arreglos

Su tamaño puede variar durante la ejecución del programa. Su acceso es secuencial

Combinan tipos de datos primitivos en estructuras complejas y permiten representar la estructura de la información que el programa debe procesar, además se pueden implementar objetos

Tamaño definido antes de la ejecución del programa, no varían durante la ejecución.

Almacenan datos del mismo tipo o clase, se puede acceder a la información guardada mediante índices, además se puede trabajar arreglo de arreglos y arreglos escalonados

Poseen un solo índice de accesibilidad a la información, el tamaño depende de un solo dato

TipoArreglo nombreDelArreglo[]= new Tipo de arreglo[n] ; donde n es el tamaño del arreglo, TipoArreglo puede ser int, char, double, clasePersona, etc. (En java)

La estructura básica de este tipo de estructuras son los llamados NODOS, los cuales se componen por dos cosas importantes, la primera: donde se encuentran los datos, y la segunda: la que referencia a un objeto tipo nodo; por lo que podemos decir que es auto-referenciable,

la estructura básica del nodo es la siguiente:

public class NODO {

int dato; NODO sgt;

{

Poseen dos índices de accesibilidad a la información, el tamaño depende dos datos (número de filas y número de columnas)

TipoArreglo nombreDelArreglo[][]= new Tipo de arreglo[f][c] ; donde f son las filas y c las columnas, TipoArreglo puede ser int, char, double, clasePersona, etc.(En java)

Poseen dos a más índices de accesibilidad a la información, cuando hacemos referencia a multidimensión facilmente podemos hablar de arreglo de arreglos. De la misma forma podemos pensar en un arreglo más próximo al tema de multidimensionalidad como: un arreglo con un índice más con respecto a una matriz; dandonos una idea de "un cubo"

TipoArreglo nombreDelArreglo[][][]= new Tipo de arreglo[f][c][m] ; donde f son las filas, c las columnas, m las capas, TipoArreglo puede ser int, char, double, clasePersona, etc. (Sin embargo, un arregllo multidimensional puede aludir a una matriz que tiene por elementos arreglos)

Además de la diferencia de la manipulación del tamaño en la ejecución, existe algo por recalcar, el acceso varia dependiendo el tipo de dato estructurado. Si bien el estático favorece el acceso de una manera directa o aleatoria ( debido al índice ), cosa que no se cuenta en una estructura dinámica debido a que esta es secuencial y carece de índice; hay una desventaja en ciertos métodos tales como insertar y eliminar, cosa que en las dinámicas es mucho más facil que en las estáticas.

Esta estructura de datos se carecteriza por lo siguiente:
Su modo de acceso es del tipo FILO ( last in, first out) el último en entrar es el primero en salir; además de ser muy sencillo y posee una buena respuesta a los procesos

Posee dos operaciones básicas tales como : push (apilar) y pop (desapilar); con esto se puede entender que hay acceso siempre al último elemento y , para acceder al resto, debemos empezar por retirar este último (top of stack) y así consecutivamente hasta llegar al deseado

En java se puede emplear la clase Stack para realizar la tarea de una pila

Esta estructura de datos se carecteriza por lo siguiente:
Su modo de acceso es del tipo FIFO ( first in, first out) el primero en entrar es el primero en salir; al contrario de una pila, los elementos se insertan por un extremo y salen por el otro.

Posee operaciones básicas como : encolar , agregar un elemento al final de la cola; y desencolar, que quita el primer elemento al principio de la cola. Además de la operación frente, que devuelve el último elemento agregado

Podemos encontrar colas lineales o prioridad, circulares(donde el primer elemento y el último están unidos) y bicolas(los nodos se pueden añadir y quitar por ambos extremos, llamados DEQUE)

Esta estructura de datos es una de las fundamentales y se la puede usar para implementar otras estructuras de datos(como las pilas y las colas).
Es una secuencia de datos dispuestos uno detrás de otro (un nodo destrás de otro) y se relacionan a través de un "enlace"

Debido a que se compone de nodos, los cuales son auto-referenciables, esos enlaces también se pueden conocer como "referencias"

Las listas enlazadas se clasifican en : simplemente enlazadas, doblemente enlazadas, circularmente enlazadas y circular doblemente enlazada

SIMPLEMENTE ENLAZADA

SIMPLEMENTE ENLAZADA

DOBLEMENTE ENLAZADA

DOBLEMENTE ENLAZADA

CIRCULARMENTE ENLAZADA

CIRCULARMENTE ENLAZADA

CIRCULAR DOBLEMENTE ENLAZADA

CIRCULAR DOBLEMENTE ENLAZADA

Esta estructura se caracteriza por la forma que posee al ser representada, ya que hace referencia a la forma jerárquica de un árbol (aunque facilmente se parece a una raíz).En java se usan TreeMap para representar un BST(Binary Search Tree). Debido a esto, a continuación se muestra una terminología usada para estos árboles

Sirve para estructurar

Ambos son TDAs (TIPOS DE DATOS ABSTRACTOS

Los TDA o ADT (en inglés), son un tipo de dato definido por el usuario, cuyas operaciones especifican como un usario (que sería el cliente) puede manipular datos, definiendo así una interfaz entre usuario y dato; por otro lado, un TDA se representa por medio de clases

Raíz: El nodo superior de un árbol.
Hijo: Un nodo conectado directamente con otro cuando se aleja de la raíz.
Padre: La noción inversa de hijo.
Hermanos: Un conjunto de nodos con el mismo padre
Descendiente: Un nodo accesible por descenso repetido de padre a hijo.
Ancestro: Un nodo accesible por ascenso repetido de hijo a padre.
Hoja: Un nodo sin hijos.
Nodo interno: Un nodo con al menos un hijo
Grado: Número de subárboles de un nodo
Brazo: La conexión entre un nodo y otro
Camino: Una secuencia de nodos y brazos conectados con un nodo descendiente.
Nivel: El nivel de un nodo se define por 1 + (el número de brazos entre el nodo y la raíz)
Altura de un nodo: La altura de un nodo es el número de brazos en el camino más largo entre ese nodo y una hoja
Altura de un árbol: La altura de un árbol es la altura de su nodo raíz
Profundidad: La profundidad de un nodo es el número de brazos desde la raíz del árbol hasta un nodo
Bosque: Un bosque es un conjunto de árboles n ≥ 0 disjuntos
Rama: Una ruta del nodo raíz a cualquier otro nodo.

Dentro de los árboles encontramos a los famosos árboles binarios: cuya característica principal es que cada nodo posee un hijo izquierdo y uno derecho, no excediendo mas de dos hijos por nodo. Además de los árboles binarios de búsqueda: los cuales son arboles binarios que satisfacen la siguiente condición:

Árbol binario de búsqueda

Sea A un árbol binario de raíz R e hijos izquierdo y derecho (posiblemente nulos) HI y HD , respectivamente.

Decimos que A es un árbol binario de búsqueda (ABB) si y solo si se satisfacen las dos condiciones al mismo tiempo:


"HI es vacío" o ("R es mayor que todo elemento de HI" y "HI es un ABB").

"HD es vacío" o ("R es menor que todo elemento de HD" y "HD es un ABB").

Un grafo

Un grafo

Los árboles tienen muchas utilidades en el ámbito informático tales como : En árboles de busqueda,hash trees, treap(que tiene que ver con redes inalámbricas y asignación en memoria), huffman coding tree ( que tienen que ver con los archivos de formato .jpeg y .mp3), etc

si se analiza el árbol en base a la condicion, se obtiene que es un BST.

Partes básicas

Grafos dirigidos

Grafos dirigidos

Grafos ponderados, etiquetados, con costos o pesados

Grafos ponderados, etiquetados, con costos o pesados

Grafos no dirigidos

Grafos no dirigidos

Esta estructura se caracteriza por que existe una relación entre los nodos que la componen, mediante "aristas", estos grafos son estudiados en la TEORÍA DE GRAFOS (donde se estudia su implementación mediante un lenguaje de programación). Sus aplicaciones son diversas en las ciencias computacionales y matemáticas debido, justamente, a la teoría de datos. Los grafos son escenciales para las resoluciones de algoritmos complejos.

Dentro de los grafos podemos encontrar diversos tipos; sin embargo, de forma básica son interesantes los siguientes (los demás se estudiarán más a fondo luego de comprender los mencionados) :

Se dice que un arbol se convierte en grafo, si uno de los nodos hijos llegase a tener dos padres