Académique Documents
Professionnel Documents
Culture Documents
PUERTO
ESTRUCTURA DE DATOS
DOCENTE: YOLANDA
2. Abstraccin de datos:
Tipo de datos: proporcionado por los leguajes de alto nivel. La representacin usada es
invisible al programador, al cual solo se le permite ver las operaciones predefinidas para cada
tipo.
TDA: para la definicin y representacin de tipos de datos (valores + operaciones), junto con
sus propiedades.
Memoria dinmica:
La reserva de memoria dinmica se hace en tiempo de ejecucin despus de leer los datos y de
conocer el tamao exacto del problema. Como consecuencia se adapta mucho mejor a las
necesidades en cada caso.
El sitio donde se almacenan los objetos se denominan en ingles heap o free store traducido como
montculo o memoria libre, y el sitio preciso donde se encuentre depende del compilador y el tipo
de puntero utilizado. La creacin y destruccin de los objetos est en manos del programador a
travs de los operadores new y delate.
En C# las variables que se declaran son punteros y se pasan eficientemente con referencia,
tampoco es necesario considerar la liberacin de la memoria puesto que framework se encarga de
liberar todas las referencias que no se estn utilizando y compactar la memoria para mejorar el
rendimiento.
Memoria Esttica
La forma ms fcil de almacenar el contenido de una variable en memoria en tiempo de ejecucin
es en memoria esttica o permanente a lo largo de toda la ejecucin del programa.
using System;
using System.Collections.Generic;
using System. Text;
namespace ConsoleApplication1
{
class Csimple
{
static void Main(string[] args)
{
int[] numeros = new int[] { 1, 2, 3, 4, 5 };
for (int i = 0; i <>
Console.WriteLine("Numero:{0}={1}", i + 1, numeros[i]);
Console.ReadLine();
}
}
}
}
}
}
La salida en la consola de este programa sera la siguiente:
El permetro de una circunferencia de radio 4 es 25,1327408
El rea de un crculo de radio 4 es 50,2654816
}
RECURSIVIDAD:
Concepto de recursividad:
La recursividad es una tcnica de programacin importante. Se utiliza para realizar una llamada a
una funcin desde la misma funcin. Como ejemplo til se puede presentar el clculo de nmeros
factoriales. l factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan
mediante la multiplicacin de 1 * 2 * , incrementando el nmero de 1 en 1 hasta llegar al nmero
para el que se est calculando el factorial.
El siguiente prrafo muestra una funcin, expresada con palabras, que calcula una factorial.
Si el nmero es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente entero.
Si el nmero es cero, su factorial es uno. Si el nmero es mayor que cero, se multiplica por l
factorial del nmero menor inmediato.
Para calcular el factorial de cualquier nmero mayor que cero hay que calcular como mnimo el
factorial de otro nmero. La funcin que se utiliza es la funcin en la que se encuentra en estos
momentos, esta funcin debe llamarse a s misma para el nmero menor inmediato, para poder
ejecutarse en el nmero actual. Esto es un ejemplo de recursividad.
La recursividad es un concepto importante en informtica. Muchos algoritmos se pueden describir
mejor en trminos de recursividad.
Supongamos que P es un procedimiento que contiene una sentencia de Llamada a s mismo o una
sentencia de Llamada a un segundo procedimiento que puede eventualmente llamar de vuelta al
procedimiento original P. Entonces P se dice que es u procedimiento recursivo. Como el programa
no ha de continuar ejecutndose indefinidamente, un procedimiento recursivo ha de tener las dos
siguientes propiedades:
(1) Debe existir un cierto criterio, llamado criterio base, por el que el procedimiento no se llama as
mismo.
(2) Cada vez que el procedimiento se llame a si mismo(directa o indirectamente), debe estar ms
cerca del criterio base.
Un procedimiento recursivo con estas dos propiedades se dice que est bien definido.
Similarmente, una funcin se dice que est definido recursivamente si la definicin de la funcin se
refiere a s misma. De nuevo, para que la definicin no sea circular, debe tener las dos siguientes
propiedades:
(1) Debe haber ciertos argumentos, llamados valores base, para los que la funcin no se refiera a
s misma.
(2) Cada vez que la funcin se refiera a s misma, el argumento de la funcin debe acercarse ms
al valor base.
Una funcin recursiva con estas dos propiedades se dice tambin que est bien definida.
Tipos.
Podemos distinguir dos tipos de recursividad:
Directa: Cuando un subprograma se llama a s mismo una o ms veces directamente. Indirecta:
Cuando se definen una serie de subprogramas usndose unos a otros.
Caractersticas.
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no recursiva y un a condicin
de terminacin. La parte recursiva y la condicin de terminacin siempre existen. En cambio la
parte no recursiva puede coincidir con la condicin de terminacin. Algo muy importante a tener en
cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento en
que no hacemos ms llamadas recursivas. Si no se cumple esta condicin el programa no parar
nunca.
Ventajas e inconvenientes. La principal ventaja es la simplicidad de comprensin y su gran
potencia, favoreciendo la resolucin de problemas de manera natural, sencilla y elegante; y
facilidad para comprobar y convencerse de que la solucin del problema es correcta. El principal
inconveniente es la ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso
es necesario transformar el programa recursivo en otro iterativo, que utiliza bucles y pilas para
almacenar las variables.
Cinco filsofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada
filsofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son
necesarios dos tenedores y cada filsofo slo puede tomar los que estn a su izquierda y derecha.
Si cualquier filsofo toma un tenedor y el otro est ocupado, se quedar esperando, con el tenedor
en la mano, hasta que pueda tomar el otro tenedor, para luego empezar a comer.
Si dos filsofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condicin
de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer.
Si todos los filsofos toman el tenedor que est a su derecha al mismo tiempo, entonces todos se
quedarn esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo
har porque todos se encuentran en la misma situacin (esperando que alguno deje sus
tenedores). Entonces los filsofos se morirn de hambre. Este bloqueo mutuo se denomina
interbloqueo o deadlock.
El problema consiste en encontrar un algoritmo que permita que los filsofos nunca se mueran de
hambre.
https://www.youtube.com/watch?v=i1RfAyyFQ0w
ESTRUCTURAS LINEALES:
Las estructuras lineales de datos se caracterizan porque sus elementos estn en secuencia,
relacionados en forma lineal, uno luego del otro.
Cada elemento de la estructura puede estar conformado por uno o varios subelementos o campos
que pueden pertenecer a cualquier tipo de dato, pero que normalmente son tipos bsicos.
Listas:
es una de las estructuras de datos fundamentales, y puede ser usada para implementar otras
estructuras de datos. Consiste en una secuencia de nodos, en los que se guardan campos de
datos arbitrarios y una o dos referencias, enlaces o punteros al nodo anterior o posterior. El
principal beneficio de las listas enlazadas respecto a los vectores convencionales es que el orden
de los elementos enlazados puede ser diferente al orden de almacenamiento en la memoria o el
disco, permitiendo que el orden de recorrido de la lista sea diferente al de almacenamiento.
Una lista enlazada es un tipo de dato autorreferenciado porque contienen un puntero o enlace (en
ingls link, del mismo significado) a otro dato del mismo tipo. Las listas enlazadas permiten
inserciones y eliminacin de nodos en cualquier punto de la lista en tiempo constante (suponiendo
que dicho punto est previamente identificado o localizado), pero no permiten un acceso aleatorio.
Existen diferentes tipos de listas enlazadas: listas enlazadas simples, listas doblemente enlazadas,
listas enlazadas circulares y listas enlazadas doblemente circulares.
Las listas enlazadas pueden ser implementadas en muchos lenguajes. Lenguajes tales
como Lisp y Scheme tiene estructuras de datos ya construidas, junto con operaciones para
acceder a las listas enlazadas. Lenguajes imperativos u orientados a objetos tales
como C o C++ y Java, respectivamente, disponen de referencias para crear listas enlazadas.
Colas:
Una cola constituye una estructura lineal de datos en la que los nuevos elementos se introducen
por un extremo y los ya existentes se eliminan por el otro. Es importante sealar que los
componentes de la cola se eliminan en el mismo orden en el cual se insertaron. Es decir, el primer
elemento que se introduce en la estructura ser el que se eliminara en primer orden. Debido a esta
caracterstica, las colas tambin reciben el nombre de estructuras FIFO (First-In, First-Out: el
primero en entrar es el primero en salir).
Implementacin
Las colas, al igual que las pilas, no existen como estructuras de datos estndar en lenguajes de
programacin. Este tipo de estructura de datos se puede representar mediante el uso de:
-Arreglos
-Listas
Pila:
Una pila (stack en ingls) es una lista ordenada o estructura de datos en la que el modo de acceso
a sus elementos es de tipo LIFO (del ingls Last In First Out, ltimo en entrar, primero en salir)
que permite almacenar y recuperar datos. Esta estructura se aplica en multitud de ocasiones en el
rea de informtica debido a su simplicidad y ordenacin implcita de la propia estructura.
Para el manejo de los datos se cuenta con dos operaciones bsicas: apilar (push), que coloca un
objeto en la pila, y su operacin inversa, retirar (o desapilar, pop), que retira el ltimo elemento
apilado.
En cada momento slo se tiene acceso a la parte superior de la pila, es decir, al ltimo objeto
apilado (denominado TOS, Top of Stack en ingls). La operacin retirar permite la obtencin de
este elemento, que es retirado de la pila permitiendo el acceso al siguiente (apilado con
anterioridad), que pasa a ser el nuevo TOS.
Por analoga con objetos cotidianos, una operacin apilar equivaldra a colocar un plato sobre una
pila de platos, y una operacin retirara retirarlo.
Las pilas suelen emplearse en los siguientes contextos:
Implementacin de recursividad.
ESTRUCTURAS NO LINEALES:
Arboles:
En ciencias de la informtica, un rbol es una estructura de datos ampliamente usada que imita la
forma de un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se
construye el rbol y puede tener cero o ms nodos hijos conectados a l. Se dice que un nodo
es padre de un nodo si existe un enlace desde hasta (en ese caso, tambin decimos
que es hijo de ). Slo puede haber un nico nodo sin padres, que llamaremos raz. Un nodo
que no tiene hijos se conoce como hoja. Los dems nodos (tienen padre y uno o varios hijos) se
les conoce como rama.
Formalmente, podemos definir un rbol de la siguiente forma:
Caso base: un rbol con slo un nodo (es a la vez raz del rbol y hoja). Un nuevo rbol a partir de
un nodo
rboles
con
de races
elementos cada uno, puede construirse estableciendo una relacin
padre-hijo entre
de
nodos
unin de los
, los
se les denota
(a distancia
El recorrido en preorden, tambin llamado orden previo consiste en recorrer en primer lugar
la raz y luego cada uno de los hijos
en orden previo.
El recorrido en inorden, tambin llamado orden simtrico (aunque este nombre slo cobra
significado en los rboles binarios) consiste en recorrer en primer lugar
luego cada uno de los hijos
, luego la raz y
en orden simtrico.
https://www.youtube.com/watch?v=wBjBKc66q_0
METODOS DE ORDENAMIENTO Y BUSQUEDA:
ALGORITMO DE BURBUJA:
Tambin conocido como ordenamiento de burbuja, es un algoritmo que se aplica para poder
ordenar una cantidad de datos ya sea de forma ascendente o descendente.
Es el algoritmo ms fcil de implementar, pero a cambio pagamos un alto precio en procesamiento,
ya que este mtodo evala una cantidad los datos muchas veces y en ocasiones innecesariamente
(como por ejemplo cuando son iguales).
A estas alturas posiblemente ya tengas conocimiento de sencillos pasos para ordenar datos, como
por ejemplo, Determinar cul es el mayor o menor de dos nmeros, pues aplicando este mtodo
podremos ordenar array, estructuras y cualquier tipo de dato NO atmico (es decir que se pueda
dividir)
Este mtodo necesita de lo siguiente para implementarse:
EJEMPLO:
....
//DE MENOR A MAYOR (Ascendente)
#define Nelementos 4
....
int i,j;
//Variables contadoras del ciclo.
int lista[Nelementos]={6,9,3,1}; //Declaracion e inicializacin de un arreglo de 4 elementos.
int temp=0;
//Variable temporal.
for (i=1;i<Nelementos;i++)
{
for (j=0; j <= Nelementos-1 ;j++)
{
if (lista[j] > lista[j+1])//Condicion mayor-menor
{
temp=lista[j];
lista[j]=lista[j+1];
lista[j+1]=temp;
}
}
}
//Para cambiar el modo de ordenamiento solo debemos cambiar la condicion < >
Aunque en realidad usa dos ciclos un while y un for, el while hace la funcin de nuestro
primer for. Sin embargo la dems implementaciones son tcnicamente las mismas, solo
que en vez de usar una variable ya preparada (j en nuestro caso), este evala con la
variable i.
<source lang=c>
VARIANTE: RESTAR
Esta es una de las ms usuales que he visto en los libros, folletos y otros. Todo es igual, pero
cambian las condiciones, de esta forma se trabaja a la inversa de nuestro algoritmo.
1. Selecciona un valor del arreglo como pivote es decir un numero por el cual todos los elementos
van a ser comparados.
2. se realizan dos bsquedas: una de izquierda a derecha, buscando un elemento mayor que el
pivote, y otra de derecha a izquierda, buscando un elemento menor que el pivote. Cuando se han
encontrado los dos, se intercambian, y se sigue realizando la bsqueda hasta que las dos
bsquedas se encuentran.
3. luego se organizan los subarreglos que quedaron a mano derecha e izquierda.
Ejemplo:
Tenemos un arreglo que est definido con los valores {22,40,4,10,12,35} los pasos en quicksort
para arreglarlo son los siguientes:
3. si seguimos la bsqueda la primera encuentra el valor 40, y la segunda el valor 10,pero ya se han
cruzado, as que paramos. Para terminar la divisin, se coloca el pivote en su lugar el numero
encontrado por la segunda bsqueda, el 10 quedando: {10,12,4,22,40,35}
4. ahora tenemos dividido el arreglo en dos arreglos ms pequeos que son {10,12,4} y el {40,35}, y
en ellos se repetir el mismo proceso.
PSEUDOCODIGO
Principal
variables A: arreglo[1..100] entero
variables i,j,central:entero
variables primero, ultimo: entero
para i = 1 hasta 100
leer(A[i])
Fin para
primero = 1
ultimo = 100
short(A[],100)
Fin
Funcin qsort(primero, ultimo:entero)
i = primero
j = ultimo
central = A[(primero,ultimo) div 2]
repetir
mientras A[i]
j=j-1
fin mientras
si i < = j
aux = A[i]
A[j] = A[i]
A[i] = aux
i=i+1
j=j-1
fin si
hasta que i > j
si primero < j
partir(primero,j)
fin si
si i < ultimo
partir(i, ultimo)
fin si
fin funcin qsort
IMPLEMENTACION EN JAVA
ORDENAMIENTO SHELL
El Shell Sort es una generalizacin del ordenamiento por insercin , teniendo en cuenta dos
observaciones:
El ordenamiento por insercin es eficiente si la entrada est "casi ordenada".
El ordenamiento por insercin es ineficiente, en general, porque mueve los valores slo una
posicin cada vez.
El algoritmo Shell sort mejora el ordenamiento por insercin comparando elementos separados por
un espacio de varias posiciones. Esto permite que un elemento haga "pasos ms grandes" hacia
su posicin esperada. Los pasos mltiples sobre los datos se hacen con tamaos de espacio cada
vez ms pequeos. El ltimo paso del Shell sort es un simple ordenamiento por insercin, pero
para entonces, ya est garantizado que los datos del vector estn casi ordenados.
Mtodo:
Ejemplo:
public class ShellSort {
public static void main(String args[]){
int arrayEntrada[]={321, 123, 213, 234, 1, 4, 5, 6}; Este es el array de elementos que vamos a
ordenar
shellSort(arrayEntrada); llamada al mtodo shellSort
for (int i=0;i < arrayEntrada.length;i++){ Este bucle imprime el contenido del array
System.out.print(arrayEntrada[i]+" ");
}fin del for
}fin del main
public static void shellSort( int a[ ]){
for( int gap = a.length / 2; gap > 0; gap = gap == 2 ? 1 : (int) ( gap / 2.2 ) ){
for( int i = gap; i < a.length; i++ ){
int tmp = a[ i ];
int j;
for(j = i; j >= gap && tmp < a[ j - gap ] ; j -= gap ){
a[ j ] = a[ j - gap ];
}
a[ j ] = tmp;
}
}
}
}class ShellSort
57
48
37
12
92
86
33
Asignamos los elementos en colas basadas en el dgito menos significativo de cada uno de ellos.
0:
1:
2: 12, 92
3: 33
4:
5: 25
6: 86
7: 57, 37
8: 48
9:
Despus de la primera pasada, la ordenacin queda:
V: 12 92 33 25 86 57 37 48
Colas basadas en el dgito ms significativo.
0:
1: 12
2: 25
3: 33, 37
4: 48
5: 57
6:
7:
8: 86
9: 92
Lista ordenada:
V: 12, 25, 33, 37, 48, 57, 86, 92
BUSQUEDA SECUENCIAL:
a bsqueda es el proceso de localizar un registro (elemento) con un valor de llave particular. La
bsqueda termina exitosamente cuando se localiza el registro que contenga la llave buscada, o
termina sin xito, cuando se determina que no aparece ningn registro con esa llave. Bsqueda
secuencial, tambin se le conoce como bsqueda lineal. Supongamos una coleccin de registros
organizados como una lista lineal. El algoritmo bsico de bsqueda secuencial consiste en
empezar al inicio de la lista e ir a travs de cada registro hasta encontrar la llave indicada (k), o
hasta al final de la lista.
La situacin ptima es que el registro buscado sea el primero en ser examinado. El peor caso es
cuando las llaves de todos los n registros son comparados con k (lo que se busca). El caso
promedio es n/2 comparaciones. Este mtodo de bsqueda es muy lento, pero si los datos no
estn en orden es el nico mtodo que puede emplearse para hacer las bsquedas. Si los valores
de la llave no son nicos, para encontrar todos los registros con una llave particular, se requiere
buscar en toda la lista.
Mejoras en la eficiencia de la bsqueda secuencial
1)Muestreo de acceso
Este mtodo consiste en observar que tan frecuentemente se solicita cada registro y ordenarlos de
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class BusquedaSecuencial {
static BufferedReader br = null;static String N= "";static int n=0;static String[] Nombre
= new String[50];static String[] APaterno = newString[50];static String[] AMaterno = new String[50];
public static void main (String args[]){br
= new BufferedReader(new InputStreamReader(System.in));
do{menu();}while(Integer.parseInt(N)!=4);}
public static void menu(){do{System.out.println("Selecciona una de las opciones del men: \n "+ "1-
INSERTAR \n "+ "2- CONSULTAR "+ "\n 3- ELIMINAR \n "+ "4- FINALIZAR");try{N =
br.readLine();}catch(Exception e){e.printStackTrace();}}while(!esEntero(N) || conversor(N)<=0 ||
conversor(N)>=5 );
switch(Integer.parseInt(N)){case 1:insertar();break;case 2:consultar();break;case 3:eliminar();break;
case 4:imprimir();break;}}
public static void consultar(){if(n>0){String nombre="";int eureka=0;
try{System.out.println("Ingresa el Nombre : ");nombre = br.readLine();}catch(Exception
e){e.printStackTrace();}
for(int i=0; i<n;
i++){if(Nombre[i].equals(nombre)){eureka=1;}}if(eureka==1){System.out.println("Nombre
encontrado!!!!!. ");}else{System.out.println("Nombre NO localizado!!!!!.
");}}else{System.out.println("No hay elementos en la lista. ");}
}
public static boolean esEntero(String cad) {for(int i = 0; i<cad.length(); i++)if(
!Character.isDigit(cad.charAt(i)) )return false;
return true;}
public static int conversor(String x){int valor=0;
try{valor= Integer.parseInt(x);}catch(NumberFormatException e){System.out.println("Valor
invalido");}
return valor;}
public static void insertar(){
if(n<50){System.out.println("Leyendo datos de la persona: " + (n+1));
try{System.out.println("Ingresa el Apellido Paterno: ");APaterno[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
try{System.out.println("Ingresa el Apellido Materno: ");AMaterno[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
try{System.out.println("Ingresa el nombre: ");Nombre[n] = br.readLine();}catch(Exception
e){e.printStackTrace();}
n++;}else{System.out.println("El vector est lleno, elimina personas para poder insertar");}
}
FUENTES:
http://es.wikipedia.org/wiki/Tipo_de_dato_abstracto
http://aprendecomputofacil.blogspot.mx/2010/06/estructura-datos-memoria-dinamica.html
http://es.wikibooks.org/wiki/Programaci%C3%B3n_en_C/Algoritmos_y_Estructuras_de_Dato
s
http://estructuras-de-datos.wikispaces.com/ordenamiento+shell+sort
http://estructuras-de-datos.wikispaces.com/Ordenamiento+rapido+o+quickSort
http://es.wikipedia.org/wiki/Ordenamiento_Radix
http://www.programacionfacil.com/estructura_datos_csharp/definicion_recusividad
http://es.wikipedia.org/wiki/Problema_del_barbero_durmiente
http://es.wikipedia.org/wiki/Problema_de_la_cena_de_los_fil%C3%B3sofos
http://pilasycolas-estructuraslineales.blogspot.mx/
http://es.wikipedia.org/wiki/Lista_%28inform%C3%A1tica%29#Aplicaciones_de_las_listas_e
nlazadas
http://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica)
https://estructuradedatositp.wikispaces.com/6.1.+M%C3%A9todo+de+b%C3%BAsqueda+SE
CUENCIAL