Está en la página 1de 31

UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN

FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 1

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 2

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
SECUENCIAL
SECUENCIAL
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 3

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
Actividad Fundamental 3
Estructuras de datos lineales: listas
Estructura lineal compuesta por una secuencia de 0 o más elementos de algún tipo
determinado y ordenados de alguna forma.
Puede crecer o disminuir en el número de elementos y podrán insertarse o
eliminarse elementos en cualquier Universidad Pontificia de Salamanca (Campus
Madrid) Luis Rodríguez Baena, Escuela Superior de Ingeniería y Arquitectura, 2012
16 podrán insertarse o eliminarse elementos en cualquier posición sin alterar su
orden lógico.

Estructuras de datos lineales: listas


Listas contiguas.
● Los elementos ocupan posiciones contiguas de memoria.
● Se pueden implementar con arrays. Los elementos ocuparían posiciones
correlativas del array. Presentan dos problemas: La inserción o el borrado de
elementos implica mover las posiciones para mantener el orden original. o El
número de elementos de la lista se puede modificar, pero no puede sobrepasar el
tamaño máximo del array
Listas enlazadas.
● Los elementos no ocupan posiciones contiguas de memoria. Aparecen dispersos
por el almacenamiento.
● Cada elemento contiene una referencia al siguiente elemento de la estructura. ●
El orden lógico lo darán los enlaces que hay entre elementos.
● El primer elemento en el orden lógico no tiene por qué
● El primer elemento en el orden lógico no tiene por qué corresponderse con el
primer elemento almacenado. El necesario indicar cuál es el primer elemento en el
orden lógico.
● También es necesario indicar cual será el último elemento en el orden lógico de
la estructura.
● La inserción o eliminación de elementos no implica mover los elementos de sitio.
Sólo se modifican las referencias al siguiente elemento. ● Si se utilizan estructuras
de datos dinámicas el número de elementos será virtualmente ilimitado.
Pilas
Es un tipo especial de lista. Estructura lineal de datos compuesta por una secuencia
de elementos en la que las operaciones sólo se pueden realizar por uno de sus
extremos llamado cima (tope o top).
● Estructuras de tipo LIFO (Last In-First Out). Se utiliza para poder recuperar
elementos en orden inverso a como entran.
● Ejemplos reales: montones de platos. ● Aplicaciones en informática. Evaluación
de algunos tipos de expresiones Cuadros de diálogos, pantallas y menús
desplegables. o Cada cuadro se abre encima de otro; al cerrarse uno, el cuadro
activo es el último que se ha abierto. Simulación de la recursividad. … En general,
cualquier aplicación en la que se necesite recuperar información en orden inverso a
como ha entrado.
La estructura de tipo Pila no se considera implementada en nuestro lenguaje de
programación.
● En otros lenguajes, como .NET, existe la clase Stack (pila en inglés) que
implementa pilas e incluye todas las operaciones que se pueden hacer sobre las
pilas.
Será necesario crear el tipo de dato Pila.
Será necesario crear el tipo de dato Pila.
● Determinar las operaciones básicas que se pueden realizar sobre el tipo de dato
Pila: las operaciones primitivas.
● Definir el tipo de elementos que contendrá la pila.
● Definir la organización de los datos utilizando los datos y estructuras de datos que
ofrezca el lenguaje de programación.
● Implementar las operaciones primitivas para la organización de los datos definida.
Dependiendo de la organización definida, la implementación de las operaciones
primitivas variará.
Operaciones primitivas.
● Procedimiento PilaNueva(ref pila: p) Crea un pila sin elementos.
● Función lógica EsPilaVacía(valor pila: p). Devuelve verdad si la pila está vacía.
● Procedimiento PInsertar (ref pila:p; valor TipoElemento:e) o Push(ref pila : p; valor
TipoElemento: e). Inserta un elemento e en la pila y devuelve la pila resultante.
Inserta un elemento e en la pila y devuelve la pila resultante. TipoElemento es un
tipo de dato genérico que se corresponde al tipo de dato de los elementos que
contendrá la pila. ●
Procedimiento Cima(valor pila: p; ref TipoElemento : e). Devuelve en el argumento
e el elemento situado en la cima de la pila.
● Procedimiento PBorrar(ref pila : p). Elimina el elemento cima de la pila y devuelve
la pila resultante.
● Procedimiento Pop(ref pila : p; ref TipoElemento : e) o Sacar(ref pila : p; ref
TipoElemento : e). Elimina un elemento

Colas
Estructura lineal de datos compuesta por un conjunto de elementos en la que la
adición de nuevos elementos se hará por un extremo de la cola, final (rear), y la
salida de elementos por el contrario, principio (front). Estructura de datos de tipo
FIFO (first in-first out), es decir el primer elemento en entrar es el primero en salir.
En aplicaciones informáticas se utiliza para controlar procesos que tengan que
realizarse en un cierto orden (colas de impresión, colas de prioridades, etc.)

La estructura de tipo Cola no se considera implementada en nuestro lenguaje de


programación.
● En otros lenguajes, como .NET, existe la clase Queue (cola en inglés) que
implementa colas e incluye todas las operaciones que se pueden hacer sobre las
colas. Será necesario crear el tipo de dato Cola. Será necesario crear el tipo de dato
Cola.
● Determinar las operaciones básicas que se pueden realizar sobre el tipo de dato
Cola: las operaciones primitivas.
● Definir el tipo de elementos que contendrá la cola.
● Definir la organización de los datos utilizando los datos y estructuras de datos que
ofrezca el lenguaje de programación.
● Implementar las operaciones primitivas para la organización de los datos definida.
Dependiendo de la organización definida, la implementación de las operaciones
primitivas variará.
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 4

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
ACTIVIDAD FUNDAMENTAL 4
Realizar un programa de un método de ordenamiento, y entregar de manera digital un documento
con el código, pantallazo de corrida, asi como el ejecutable del mismo

PANTALLAZO DE CÓDIGO

PANTALLAZO DE CORRIDA
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 5

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
TABLAS HASH
Las tablas hash son estructuras de datos que se utilizan para almacenar un número
elevado de datos sobre los que se necesitan operaciones de búsqueda e inserción
muy eficientes. Una tabla hash almacena un conjunto de pares“(clave, valor)”. La
clave es única para cada elemento de la tabla y es el dato que se utiliza para buscar
un determinado valor.

Características:
Una tabla hash se construye con tres elementos básicos:
 Un array capaz de almacenar “m” elementos
 Función Hash o de dispersiónque permita a partir de
los datos (llamados clave) obtener el índice donde
estará el dato en el arreglo
 Una función de resolución de colisiones
Función Hash: Una función hash es método para generar
claves o llaves que representen de manera casi unívoca a
un documento o conjunto de datos. Es una operación
matemática que se realiza sobre este conjunto de datos de
cualquier longitud, y su salida es una huella digital, de
tamaño fijo e independiente de la dimensión del documento original. El contenido
es ilegible
Las operaciones básicas implementadas en las tablas hash son:
inserción(llave, valor)
búsqueda(llave) que devuelve valor

La mayoría de las implementaciones también incluyen borrar (llave).También se


pueden ofrecer funciones como iteración en la tabla, crecimiento y vaciado. Algunas
tablas hash permiten almacenar múltiples valores bajo la misma clave.
Para usar una tabla hash se necesita:

 Una estructura de acceso directo (normalmente un array).


 Una estructura de datos con una clave.
 Una función resumen (hash) cuyo dominio sea el espacio de clases y su
imagen (o rango) los números naturales.
Colisiones: Son producto de cuando dos elementos de información distintos, la
función de dispersión les asigna la misma clave.
La potencia de las tablas hash se encuentra en la búsqueda de elementos;
conociendo el campo clave se puede obtener directamente la posición que ocupa,
y por tanto, la información que se encuentra almacenada en ese espacio de
memoria.

Es claro, que el hashing tiene sus desventajas como cualquier algoritmo, y una de
ellas es lo que se le conoce como colisiones (la operación matemática definida por
la función de dispersión para calcular la posición que ocupa pueda pertenecer a un
campo mas) y la otra, el uso innecesario de memoria en declaraciones de
estructuras amplias intentando evitar dichas colisiones. Por muy buena que sea la
distribución que se realice en la tabla siempre hay posibilidad de que colisiones dos
claves, por ello el estudio del direccionamiento disperso se divide en dos partes:
búsqueda de funciones hash y resolución de colisiones. Existen métodos para
intentar evitar en su mayoría las colisiones, pero no son totalmente perfectos y fijos,
pero los más populares son exploración de direcciones y hashing enlazado
La eficacia de una tabla hash va de acuerdo a como se tratan las colisiones y la
lógica de un algoritmo que permita un rápido acceso e inserción de datos a la
estructura sin ninguna fuga de datos.
Una de las aplicaciones de las tablas hash esta en los compiladores de lenguajes
de programación. La tabla donde se guardan los identificadores del programa, tabla
de símbolos, se implementa como una tabla hash. La clave es el símbolo que se
transforma en un valor entero para aplicar alguna de las funciones hash.
Se pretende con este trabajo de investigación descubrir esta importante y rápida
herramienta y de a ello describir y utilizar las funciones hash como algoritmo más
eficaz que los arrays
Existen dos tipos de tablas hash, en función de cómo resuelven las colisiones:
Encadenamiento separado: Las coliciones se resuelven insertándolas en una
lista. De esa forma tendríamos como estructura un vector de listas. Al número medio
de claves por lista se le llama factor de carga y habría que intentar que esté próximo
a 1.
Direccionamiento abierto: Utilizamos un vector como representación y cuando se
produzca una colisión la resolvemos reasignándole otro valor hash a la clave hasta
que encontremos un hueco.
Inserción:
1. Para almacenar un elemento en la tabla hash se ha de convertir su clave a un
número.
Esto se consigue aplicando la función resumen a la clave del elemento.
2. El resultado de la función resumen ha de mapearse al espacio de direcciones del
arreglo que se emplea como soporte, lo cual se consigue con la función módulo.
Tras este paso se obtiene un índice válido para la tabla.
3. El elemento se almacena en la posición de la tabla, obtenido en el paso anterior.
a. Si en la posición de la tabla ya había otro elemento, se ha producido una colisión.
Este problema se puede solucionar asociando una lista a cada posición de la tabla,
aplicando otra función o buscando el siguiente elemento libre. Estas posibilidades
han de considerarse a la hora de recuperar los datos.

Búsqueda:

1. Para recuperar los datos, es necesario únicamente conocer la clave del elemento,
a la cual se le aplica la función resumen.
2. El valor obtenido se mapea al espacio de direcciones de la tabla.
3. Si el elemento existente en la posición indicada en el paso anterior tiene la misma
clave que la empleada, entonces es el deseado. Si la clave es distinta, se ha de
buscar el elemento según la técnica empleada para resolver el problema de las
colisiones al almacenar el elemento.
Para utilizar las tablas hash en C# necesitamos el nombre de espacio Collections;
El cual lo invocamos de la siguiente forma
using System.Collections;
Sintaxis de métodos que utiliza las tablas hash en C#
• Para crear la tabla hash:
o Hashtable nombretable = new Hashtable()
• Para agregar valores.
o Nombretable.Add(clave, valor);
• Para accedes a los valores por medio de la clave.
o Nombretable [clave]
• Quitar un par llave/valor de la colección.
o Nombretable.Remove(clave)
• Saber si la colección contiene un par cuya clave sea la que se le pasa como
parámetro.
o Nombretable.ContainsKey(clave)
• Contiene un par cuyo valor sea el que se le pasa como parámetro.
o Nombretable.ContainsValue (valor)
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 6

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
CUADRO COMPARATIVO

BUSQUEDA SECUENCIAL BUSQUEDA BINARIA

Busca un elemento comparándolo Divide y compara con elementos


consecutivamente con cada uno de los centrales, si los elementos centrales, si el
elementos existentes en el arreglo, hasta elemento es menor se encuentra a la
encontrar el elemento buscando o hasta izquierda en caso contrario se busca a la
llegar al final de arreglo. derecha

Se utiliza cuando el vector no está Debe estar ordenado.


ordenado o cuando no se puede ordenar.

Iterativo Recursivo

Fácil de implementar y no requiere orden Reduce el tiempo de búsqueda de un


de entradas elemento y, con los archivos grandes,
que se reduce la mitad con una sola
comparación

En un mejor caso: Se encuentra en la En el mejor caso: Requiere solo una


primera entrada comparación

En un peor caso: No se encuentra o está En el peor caso: Dividir el arreglo muchas


en la última posición veces y no encontrar el valor

Es más fácil de implementar, por esto es Es más eficiente por reducir el tiempo de
más común búsqueda
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021

Programación de estructuras de datos

Actividad fundamental 7
Tipos de búsqueda

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 8

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
Actividad fundamental 8
UNIVERSIDAD AUTÓNOMA DE NUEVO LEÓN
FACULTAD DE INGENIERÍA MECÁNICA Y ELÉCTRICA

Semestre Agosto-Diciembre 2021


Programación de estructuras de datos

Actividad fundamental 9
Grafos

Dra. Karla Nathali Porras Vazquez


Grupo 004 V5 LMV

Estefanía Trujillo Elizondo


Matricula: 1899528 Carrera: IAS
Grafos
Los grafos son una estructura interesante de conjuntos de objetos que
denominamos nodos. En ellos se almacena diversos tipos de recursos o
datos que tenemos la posibilidad de usar para procesar o conocer con
objetivos específicos.
Adicionalmente estos nodos, suelen estar unidos o conectados a otros nodos
a través de elementos que denominamos aristas.
Los nodos pertenecientes a un grafo pueden contener datos estructurada o
no estructurada y al interrelacionarse con otros nodos producen relaciones
interesantes que podemos analizar con diferentes finalidades.
Estos elementos son reconocidos por su capacidad de manejar altos
volúmenes de datos y ser fácilmente procesados por motores de búsqueda o
gestores de bases de datos orientados a grafos.

Historia
El trabajo de Leonhard Euler, en 1736, sobre el problema de los puentes de
Königsberg es considerado el primer resultado de la teoría de grafos.
También se considera uno de los primeros resultados topológicos en
geometría (que no depende de ninguna medida). Este ejemplo ilustra la
profunda relación entre la teoría de grafos y la topología. En 1845 Gustav
Kirchhoff publicó sus leyes de los circuitos para calcular el voltaje y la
corriente en los circuitos eléctricos. En 1852 Francis Guthrie planteó el
problema de los cuatro colores que plantea si es posible, utilizando solamente
cuatro colores, colorear cualquier mapa de países de tal forma que dos países
vecinos nunca tengan el mismo color. Este problema, que no fue resuelto
hasta un siglo después por Kenneth Appel y Wolfgang Haken, puede ser
considerado como el nacimiento de la teoría de grafos. Al tratar de resolverlo,
los matemáticos definieron términos y conceptos teóricos fundamentales de
los grafos.

Teoría de grafos
La Teoría de grafos es una mezcla impresionante de cultura, historia,
soluciones matemáticas y retos que llevaron un buen tiempo para ser
resueltos con fórmulas matemáticas.
La teoría de grafos nació con la finalidad de representar de forma visual
conjuntos abstractos de datos que se encuentran en el mundo real para ser
útiles en soluciones de problemas de complejidad.

Un ejemplo de grafo dirigido lo constituye la red de aguas de una ciudad


ya que cada tubería sólo admite que el agua la recorra en un único
sentido, por el contrario, la red de carreteras de un país representa en
general un grafo no dirigido, puesto que una misma carretera puede ser
recorrida en ambos sentidos. No obstante, podemos dar unas
definiciones generales para ambos tipos.

Notación y conceptos
Un grafo G es un conjunto en el que hay definida una relación binaria,es decir,
G=(V,A) tal que V es un conjunto de objetos a los que denominaremos vértices o
nodos y
A Í V x V es una relación binaria a cuyos elementos denominaremos arcos o aristas.

Dados x, y Î V, puede ocurrir que:

Ø (x, y) Î A, en cuyo caso diremos que x e y están unidos mediante un arco y,

Ø (x, y) Ï A, en cuyo caso diremos que no lo están.

Si las aristas tienen asociada una dirección (las aristas (x,y) y (y,x) no son
equivalentes) diremos que el grafo es dirigido, en otro caso ((x,y)=(y,x)) diremos que
el grafo es no dirigido.

Estructura de lista Grafo de lista de adyacencia.


• Lista de incidencia - Las aristas son representadas con un vector de
pares (ordenados, si el grafo es dirigido), donde cada par representa una de
las aristas.
• Lista de adyacencia - Cada vértice tiene una lista de vértices los cuales
son adyacentes a él. Esto causa redundancia en un grafo no dirigido (ya
que A existe en la lista de adyacencia de B y viceversa), pero las búsquedas
son más rápidas, al costo de almacenamiento extra. En esta estructura de
datos la idea es asociar a cada vértice i del grafo una lista que contenga
todos aquellos vértices j que sean adyacentes a él. De esta forma sólo
reservará memoria para los arcos adyacentes a i y no para todos los
posibles arcos que pudieran tener como origen i. El grafo, por tanto, se
representa por medio de un vector de n componentes (si |V|=n) donde cada
componente va a ser una lista de adyacencia correspondiente a cada uno
de los vértices del grafo. Cada elemento de la lista consta de un campo
indicando el vértice adyacente. En caso de que el grafo sea etiquetado,
habrá que añadir un segundo campo para mostrar el valor de la etiqueta.
Grafos planos
Un grafo es plano si se puede dibujar sin cruces de aristas.
El problema de las tres casas y los tres pozos tiene solución sobre el toro, pero no en
el plano. Cuando un grafo o multigrafo se puede dibujar en un plano sin que dos
segmentos se corten, se dice que es plano. Un juego muy conocido es el siguiente:
Se dibujan tres casas y tres pozos. Todos los vecinos de las casas tienen el derecho
de utilizar los tres pozos. Como no se llevan bien en absoluto, no quieren cruzarse
jamás. ¿Es posible trazar los nueve caminos que juntan las tres casas con los tres
pozos sin que haya cruces? Cualquier disposición de las casas, los pozos y los caminos
implica la presencia de al menos un cruce.
Sea Kn el grafo completo con n vértices, Kn, p es el grafo bipartito de n y p vértices.
El juego anterior equivale a descubrir si el grafo bipartito completo K3,3 es plano, es
decir, si se puede dibujar en un plano sin que haya cruces, siendo la respuesta que
no. En general, puede determinarse que un grafo no es plano, si en su diseño puede
encontrase una estructura análoga (conocida como menor) a K5 o a K3,3. Establecer
qué grafos son planos no es obvio, y es un problema que tiene que ver con topología.
Representaciones de grafos en memoria

Matriz de adyacencia

Un grafo se puede representar mediante una matriz A tal que A[i,j]=1 si hay
un arco que conecta vi con vj, y 0 si no. La matriz de adyacencia de un grafo
no dirigido es simétrica.

Una matriz de adyacencia permite determinar si dos vértices están


conectados o no en tiempo constante, pero requieren O(n2) bits de
memoria. Esto puede ser demasiado para muchos grafos que aparecen
en aplicaciones reales, en donde |E|<<n2. Otro problema es que se requiere
tiempo O(n) para encontrar la lista de vecinos de un vértice dado.

Recorridos de Grafos

En muchas aplicaciones es necesario visitar todos los vértices del grafo a


partir de un nodo dado. Algunas aplicaciones son:

 Encontrar ciclos
 Encontrar componentes conexas
 Encontrar árboles cobertores

Hay dos enfoque básicos:

 Recorrido (o búsqueda) en profundidad (depth-first search):


La idea es alejarse lo más posible del nodo inicial (sin repetir
nodos), luego devolverse un paso e intentar lo mismo por otro
camino.
 Recorrido (o búsqueda) en amplitud (breadth-first search):
Se visita a todos los vecinos directos del nodo inicial, luego a los
vecinos de los vecinos, etc.

Distancias Mínimas en un Grafo Dirigido

En este problema los rótulos de los arcos se interpretan como distancias. La


distancia (o largo) de un camino es la suma de los largos de los arcos que lo
componen.

El problema de encontrar los caminos más cortos tiene dos variantes:


 Caminos más cortos desde un nodo "origen"
Encontrar los n caminos más cortos desde un nodo dado s hasta
todos los nodos del grafo.
 Todos los caminos más cortos
Encontrar los n2 caminos más cortos entre todos los pares de nodos
(origen, destino). Esto se puede resolver resolviendo n veces el
problema anterior, cambiando cada vez de nodo origen, pero puede
ser más eficiente encontrar todos los caminos de una sola vez.

También podría gustarte