Professional Documents
Culture Documents
Cuando hablamos de tipos de datos básicos nos referimos a un conjunto de valores más sus
operaciones asociadas, por ejemplo, dentro del computador un número entero se representa con
un par de bytes (16 bits), con ello, sólo puede almacenar valores en un rango de [-2 16/2, +216/2]
y disponer de los operadores aritméticos: +, -, *, / y mod. Extendiendo el concepto, si
agrupamos un conjunto de valores de igual o distinto tipo de dato básico y enseguida definimos
la manera de cómo operar sobre ellos, es decir, sus métodos de acceso, estaríamos en presencia
de una ESTRUCTURA DE DATOS.
Si sugerimos el famoso juego del "El Gato" pensemos en un nivel abstracto que se trata de una
colección de casilleros en donde se deberá marcar X ó O a medida que el jugador le toque su
turno. Ya tenemos la colección de elementos X ó O y la operación marcar (X ó O según sea el
caso).
A nivel de implementación ¿qué estructura sería factible en este caso?. Por las características del
juego, (después de analizar ventajas y desventajas) concluimos que una arreglo bidimensional
de 3 x 3 de tipo carácter sería una solucion mas factible.Netcyrus Página 2
18/04/2010
Type
TableroGato = Array [1..3, 1..3] of char;
Var
TableroJuegoEntretenido:TableroGato;
Arreglos
Son una agrupación de datos homogéneos, es decir, con un mismo tipo de dato básico asociado.
Se almacenan en forma contigua en la memoria y son referenciados con un nombre común y
una posición relativa.
2
Ejemplos:
Arreglo Lineal (1 dimensión ó vector)
Vista gráfica
Definición de tipo
Type
Linea:Array [1..5] of TipoBasico;
Var
MiArreglo:Linea;
Para pensar
Para pensarlo...
Para implementar
Para implementar...
Registros (TDU)
¿Qué son los registros?
Son un tipo de datos formado por una colección finita de elementos no necesariamente
homogéneos. El acceso se realiza a través del nombre del registro seguido del campo específico
al que se desea acceder.
Supongamos la sgte. vista gráfica de un registro cualquiera:
3
OPEL CORSA SWING
1997 4.150.000
1.4
TYPE
TipoAuto = RECORD
año: integer;
marca: string[35];
precio: longint; (*Para que soporte valores >
MAXINT*)
END;
Var
AUTOMOVILES: TipoAuto;
Para acceder a cada uno de los campos se utiliza la siguiente función de acceso:
Para el registro AUTOMOVILES revisado anteriormente se tiene que el acceso a cada uno de sus
campos se realiza como sigue:
AUTOMOVILES.año
AUTOMOVILES.marca
AUTOMOVILES.precio
La principal ventaja del uso de registros es que posibilitan modelar objetos que contienen varias
características y acceder a ellas mediante un nombre único.
Para Implementar
1. Definir la estructura de datos que represente las cuentas bancarias para 500 clientes del
Banco Della Plaza. Ellas deben contener un saldo cuenta corriente y otro en línea de
crédito. Identifica las operaciones básicas asociadas a la estructura.
2. Definir la estructura de datos que represente un hotel 5 estrellas de 5 pisos y 10
habitaciones por piso. Identifica las operaciones básicas asociadas a la estructura.
3. Definir una estructura de datos para representar una agenda diaria. Plantear la solución
estática y dinámica. Identificar las operaciones básicas asociadas a la estructura.
4
Operaciones básicas
5
Ejemplo : Cuando se compilan las sgtes. líneas de código se produce una asignación estática de
memoria:
interes : integer;
(*Se solicita memoria para 1 entero --> 2 bytes)
Para explicar con mayor detalle el concepto de memoria dinámica es necesario conocer el
concepto ¡PUNTEROS!
Punteros
Son tipos de datos simples capaces de almacenar la posición de una variable en memoria
principal. Se dice que ellos direccionan a otras variables.
6
Ejemplo:
Se dice que las variables ubicadas en las posiciones 1003 y 1006 son punteros, pues direccionan
o "apuntan a" las posiciones 1000 y 1007 respectivamente.
Definición de Tipo
Expresa que los valores de tipo Puntero son punteros a un tipo de dato básico o estructurado
Expresa que Puntero un tipo de dato capaz de direccionar al Registro Automoviles (definido en el
tópico anterior) y que pauto1, pauto2 son dos variables de tipo puntero)
Type
TAuto=Record
anho:integer;
marca:string[30];
preciobruto:longint;
End;
7
Estos nodos de memoria son la base para la construcción de estructuras de datos dinámicas que,
como ya recordarán, son aquellas para las cuales no se asigna inmediatamente memoria, en
lugar de ello, se utiliza el concepto de asignación dinámica a través de procedimientos
incorporados al lenguaje. Así, el campo enlace mostrado en la gráfica direccionará a otro nodo
que contiene a su vez información relacionada a un nuevo automóvil y así sucesivamente.
Para referenciar a los componentes individuales de un nodo es necesario, sin duda, que exista
un puntero libre direcionándolo de manera de hacerlo a través de él.
Para acceder a cada uno de los campos se utiliza la siguiente función de acceso:
Para Pensar
Investiga con tu grupo de trabajo
¿Cuáles son los procedimientos de asignación dinámica y cómo se utilizan para Lenguaje Pascal
y Lenguaje C ?
8
PILAS O COLAS LIFO
Definición
Imagina un montón de platos "apilados" o bien fichas de dominó formando una torre e intenta
eliminar una desde el centro, ¿qué ocurre?, naturalmente esta operación no está permitida si
queremos mantener intactos a los platos o a la torre construida. Por esta razón, una pila se
asocia a una estructura de datos LIFO (LAST IN FIRST OUT). En base a lo anterior, construye la
definición de una PILA y discútela con el profesor.
En general, podemos definir para cada una de las estructuras de datos una representación
estática y otra dinámica según el método de asignación de memoria utilizado.
CLASIFICACIÓN
Definición
Pila estática
Sin duda tendremos que utilizar arreglos o registros que como ya sabemos son la base para
estructuras de datos más complejas. Considera la siguiente figura:
Vista gráfica
TYPE
______________________________
______________________________
______________________________
END;
Pila Dinámica
9
¿Cómo representar dinámicamente una pila?
Sin duda tendremos que utilizar nodos con punteros. Considera la siguiente figura:
Suponiendo que los punteros que aparecen en la figura son capaces de apuntar a un nodo y que
Dato pertenece a cualquiera de los tipos básicos o estructurados, la definición de tipo sería:
TYPE
Puntero=^NodoPila;
NodoPila=Record
Info:AlgunTipo;
sgte:Puntero;
End;
Var tope:Puntero;
Para Pensar
Establece la diferencia entre el puntero tope y el puntero sgte ubicado denntro del NodoPila.
¿Cuáles son los mecanismos de acceso a los datos almacenados en una pila?
Operaciones Básicas
• Inicialización
• Verificar si la pila está llena
• Verificar si la pila está vacía
• Empilamiento o PUSH
• Desempilamiento o POP
10
pilavacia:=(s=nil);(La función asume el valor de verdad de la condición*)
end;
function pilallena:boolean;
begin
pilallena:=(sizeof(nodo) >MAXAVAIL);
end;
Donde sizeof(nodo) devuelve el tamaño en bytes que ocupa la estructura del tipo nodo y
MAXAVAIL contiene el bloque de tamaño máximo disponible para ser asignado.
procedure push (var s: puntero; nuevoelemento:tipo);
var p:_puntero;
begin
if not pilallena(s) then
begin
new(p);
p^.info := nuevoelemento;
p^.sgte:= nil;
Un concepto por introducir es el de encapsulamiento, que significa que una vez definida la
estructura e implemetadas las operaciones básicas, uno se remite a utilizarlas sin importar su
codificación interna, es decir, las llamadas a PUSH(pila, x) o POP(pila, y) empilarán a x o
desempilarán en y sin importar cómo lo hagan.
Listas Enlazadas
Corresponde a una estructura lineal compuesta por una colección de datos homogéneos con
alguna relación entre ellos. Dicha estructura se crea a través del método dinámico de memoria.
11
En una lista enlazada el orden de los elementos está determinado por un campo enlace
(puntero) explícito en cada elemento, por ejemplo: pilas y filas dinámicas.
Una lista lineal simplemente enlazada es una estructura en la que el cada elemento enlaza con el
siguiente. El recorrido se inicia a partir de un puntero ubicado al comienzo de la lista. El último
elemento (nodo) de la lista apunta a una dirección vacía que indica el fin de la estructura.
Type
puntero = ^NodoLista;
NodoLista = Record
info: AlgunTipo;
siguiente: puntero;
end;
12
Cabe destacar que en una lista lineal enlazada, sólo es posible acceder a los elementos
sucesores pero no antecesores, además, siempre es necesario mantener un puntero a la cabeza
de la lista para acceder a los demás elementos
Listas Circulares
Una lista circular es una lista lineal en la que el último elemento enlaza con el primero. Entonces
es posible acceder a cualquier elemento de la lista desde cualquier punto dado.
Las operaciones sobre una lista circular resultan más sencillas. Cuando recorremos una lista
circular, diremos que hemos llegado al final de la misma cuando nos encontremos de nuevo en
el punto de partida; suponiendo que en este punto se deja un puntero fijo. Otra solución al
problema anterior sería ubicar en cada lista circular un elemento especial identificable, como
lugar de parada. Este elemento especial recibe el nombre de cabeza de la lista. Esto presenta la
ventaja de que la lista circular no estará nunca vacía.
Ejemplo:
Cada polinomio será representado como una lista cuyos nodos representan los términos no
nulos, como se indica a continuación:
Coeficiente
± A B C p
Donde coeficiente corresponde al coeficiente del término xAyBzC. suponiendo que los
coeficientes y exponentes están dentro de los rangos permitidos. La notación A B C se utilizará
13
para representar el campo ABC de cada elemento tratado como un número entero. El ABC y
Exponente serán siempre positivos, el campo signo indicará de esta manera el signo de cada
término. Los elementos de la lista aparecerán sobre la misma en orden decreciente del campo
ABC, siguiendo la dirección de los enlaces. Ahora bien, ¿podría indicar gráficamente como
quedaría representado el polinomio (2x3y + 4xy3 - y4) ?
Una lista doblemente enlazada es una lista lineal en la que cada elemento tiene dos enlaces, uno
al elemento siguiente y otro al elemento anterior. Esto permite recorrer la lista en cualquier
dirección.
NodoLista = Record
info: AlgunTipo;
siguiente: puntero;
anterior: puntero;
End;
Las operaciones sobre una lista doblemente enlazada se realizan sin ninguna dificultad. Sin
embargo, casi siempre es mucho más fácil la manipulación de las mismas, cuando se añade un
elemento de cabeza y existe un doble enlace entre el último elemento y el primero. Esta
estructura recibe el nombre de lista circular doblemente enlazada.
Este tipo de listas contiene más de dos enlaces por nodo, los que tienen la posibilidad de apuntar
a más de dos listas enlazadas.
14
Vista gráfica de un nodo
p Dato p
Donde p=^nodo
Intenta construir su definición de tipo considerando la vista gráfica.
Type
_________________________
_________________________
_________________________
_________________________
_________________________
_________________________
End;
Operaciones Basicas
Recorrer la Lista
Búsqueda de un Elemento
15
while (p<>NIL) and (NOT ENCONTRADO) do
begin
if p^.info = x then ENCONTRADO:=TRUE;
p:=p^sgte;
end;
busqueda:= p
Esta función devuelve un puntero a la primera ocurrencia de nodo con campo info = x o
en su defecto apuntando a NIL.
Incorporar Elementos
new(p); p^.sgte:=inicio;
inicio:= p;
(* En otro punto de la lista, antes de nodo con info=x
y con el puntero p ubicado antes del punto de inserción*)
begin
new(t); t^.sgte:=p^.sgte;
p^.sgte:=t;
end;
p:=inicio;
while (p^.sgte<>NIL) do
begin
p:=p^sgte; (*Ubica a p en el último nodo*)
end;
new(t); t^.sgte:=p^.sgte;
end;
EstaVacía:= (Inicio=NIL);
EstaLlena:= (sizeof(nodo)>MAXAVAIL);
Esta función devuelve un TRUE o un FALSE dependiendo del valor de verdad de cada
expresión
16
RECURSIVIDAD
recur
re- = volver (back)+
currere = a ejecutar (to run)
Características
Solución Iterativa
var
17
fact, contador: integer ; (*no negativo*)
BEGIN
fact := 1;
factorialIterativa: = fact
END;
Solución Recursiva
BEGIN
if n=0 then
factorialRecursiva := 1
END;
4 2 1
3 2
4 6
24 24
Seguimiento Recursivo (Factorial)
n salida
4 4*fact(3)
3 4*(3*fact(2))
2 4*(3*2*fact(1))
1 4*(3*2*1*fact(0))
0 4*(3*2*1*1)
18
Problema de la Potencia de 2 numeros enteros positivos + seguimiento
Solución Iterativa
Begin
var p:integer;
p:=1;
else
begin
end
PotenciaIterativa:= p
end
End;
Solución Recursiva
PotenciaRecursiva:= a * PotenciaRecursiva(a,b-1)
end
End;
2 3 1 2
2 4
3 8 8
19
Seguimiento Recursivo (Potencia)
a b Salida
2 3 2*pot(2,2)
2 2 2*(2*pot(2,1))
2 1 2*(2*2*pot(2,0))
2 0 2*(2*2*1)
La pregunta caso general: Suponiendo que las llamadas recursivas funcionan correctamente
¿Funciona correctamente todo el procedimiento o función? (puede verificarse a través de un
procedimiento)
¿Funciona correctamente?
Sí, ya lo demostramos.
ÁRBOLES
Introducción
Es una estructura de datos no lineal que posee raíz, ramas y hojas, técnicamente constituye un
grafo finito y sin ciclos. Un árbol define ciertos niveles jerárquicos precedidos por la raíz (1er.
nivel), en donde las hojas constituyen el nivel más bajo.
Componentes
20
Raíz: Nodo que constituye la única entrada a la estructura (por ello es necesario tener un
puntero sobre él).
Ramas o Arcos: Conexión entre dos nodos del árbol que representa una relación de jerarquía.
Características
Nivel o profundidad de un nodo: Longitud del camino para ir desde la raíz al nodo. Por definición
la raíz está en el nivel 0. Por ejemplo: profundidad(Y)=2, profundidad(raíz)=0,
profundidad(árbol)= profundidad(hoja más profunda).
Altura de un nodo: Longitud del camino más largo desde el nodo a una hoja. Por ejemplo:
Grado de árbol: Cantidad máxima de hijos posibles de asociar a un nodo del árbol
Clasificación
21
Según Estructura de Niveles
• Arbol completo: Es un árbol binario en el cual cada nodo es una hoja o posee
exactamente 2 hijos.
• Arbol lleno: Es un árbol binario con hojas en a lo más dos niveles adyacentes l-1 y l, en
las cuales los nodos terminales se encuentran ubicados en las posiciones de más a la
izquierda del árbol.
•
Según Funcionalidad
22
• Arbol binario de búsqueda (ABB)
Definición de un ABB
Un árbol binario de búsqueda es un árbol ordenado. Las ramas de cada nodo están ordenadas de
acuerdo con las siguientes reglas: para todo nodo X, las claves ubicadas en el subárbol izquierdo
son menores que la clave de X, y todas las claves del subárbol derecho de X son mayores que la
clave de X.
Un árbol de estas características permite determinar si una clave determinada existe o no, de
manera muy simple. Por ejemplo, si observamos la siguiente figura, localizar la clave 12 es
aplicar la definición de árbol de búsqueda, esto es, si la clave buscada es menor que la clave del
nodo en el que estamos, se recorrerá el subárbol izquierdo o de lo contrario el subárbol derecho.
Este proceso continúa hasta encontrar la clave o hasta llegar a un subárbol vacío cuya raíz tiene
un valor NIL.
Para Completar
23
Operaciones Básicas
• Recorrer el ABB.
TYPE
TipoPuntero = ^TipoNodoABB;
TipoNodoABB = RECORD
info : TipoInfo;
izquierdo : TipoPuntero;
derecho: TipoPuntero;
End;
------------------------------------------------------------------------
24
Procedure InicializaArbol(var RaizArbol: TipoPuntero);
Begin
RaizArbol := NIL;
End;
------------------------------------------------------------------------
------------------------------------------------------------------------
25
ptr := RaizArbol; anterior:= NIL;
While ptr ^.info.clave<> ValorClave Do
begin
anterior : = ptr;
if ptr^.info.clave > ValorClave then
ptr := ptr^.izquierdo
else
ptr := ptr^.derecho
end;
(* Suprimir nodo apuntado por ptr*, anterior apunta al padre de este nodo*)
SuprimirNodo(RaízArbol, ptr, Anterior)
END;
Procedure SuprimirNodo (Var RaízArbol : Tipo_Puntero; ptr, anterior: Tipo_ Puntero);
(* Suprime el nodo apuntado por Ptr sobre el árbol binario con puntero RaizArbol, Anterior es un
puntero al nodo padre ( NIL si el nodo a suprimir es el nodo Raiz)*)
Var
temp: Tipo_Puntero;
BEGIN
(*Caso b.1 Supresión de una hoja*)
if(ptr^.derecho = NIL) AND (ptr^.izquierdo = NIL) then
IF Anterior = NIL then (*Nodo(ptr) es el último en el árbol)
RaizArbol:= NIL
else
if anterior^.derecho = Ptr then
anterior^.derecho : = NIL
else anterior^.izquierdo: = NIL
else (* Caso b.3 supresión de nodo con dos hijos*)
if(ptr^.derecho <> NIL) AND (ptr^.izquierdo <> NIL) then
begin (* Encontrar el valor para reemplazar, valor más próximo al eliminado*)
anterior: = ptr;
temp := ptr^.izquierdo;
While temp^.derecho<> NIL Do
begin
anterior:= temp;
temp : = temp^.derecho
end;
(* Copiar la información a reemplazar en el nodo*)
ptr^.info:= temp^.info;
if anterior = Ptr then
anterior^.izquierdo:= temp^.izquierdo
else
anterior^.derecho:= temp^.izquierdo;
ptr:= temp;
end
else (* Caso b.2 Nodo con un hijo*)
(* Inicializa uno de los campos punteros de nodo (anterior) dependiendo si el nodo que se está
suprimiendo tiene un hijo a la derecha o izquierda*)
if ptr^.derecho <>NIL then (* Hay un hijo derecho*)
if anterior = NIL then
RaizArbol:= Ptr^.derecho
else
if anterior^.derecho=ptr then
anterior^.derecho := ptr^.derecho
else
anterior^.izquierdo := ptr^.derecho
else(* hay un hijo izquierdo*)
if anterior = NIL then
RaizArbol:= Ptr^.izquierdo
else
26
if anterior^.derecho=ptr then
anterior^.derecho := ptr^.izquierdo
else
anterior^.izquierdo := ptr^.izquierdo;
dispose (ptr);
END;
------------------------------------------------------------------------
Arboles de Expresión
Definición
Un árbol de expresión es una estructura que representa una operación aritmética conteniendo
dentro de su campo info un operando (numérico) o bien sus operadores asociados.
Si pensamos que los nodos del árbol contienen algunos de los operadores +,-,x y / debemos
intuir que se trata de un árbol binario de expresión como el que se indica en la figura:
27
¿Cómo obtener la expresión aritmética a partir de un AE?
Resp: Recorre el árbol en Inorden y parentiza cada subexpresión así obtendrás lo que necesitas.
ORDENAMIENTO Y BUSQUEDA
Ordenamiento
Clasificación de Métodos
• Ordenamiento Estable: Es aquel que una vez efectuado mantiene el orden relativo de
dos o más registros cuyo criterio de ordenamiento es el mismo. Es beneficioso para
ordenamientos en donde se utilice más de un criterio de ordenamiento.
• Ordenamiento No estable: Es aquel que una vez efectuado pierde el orden relativo de
dos o más registros cuyo criterio de ordenamiento es el mismo.
28
Comparación de los Métodos de Ordenamiento
Una alternativa sería comparar tiempos de ejecución, sin embargo, esto sólo sería una medida
de eficiencia sobre un computador en particular. (dependiendo la arquitectura de la máquina, set
de instrucciones etc.).
Usualmente se utiliza la notación O( ) para indicar el grado u orden del algoritmo que está dado
en términos de comparaciones realizadas. Esto representa cuantitativamente la complejidad de
un algoritmo.
Las complejidades más usuales son O(n), O(n2), O(n3), O(log2n). Para que se entienda mejor:
Orden de Magnitud
Método de Ordenación
Mejor Caso Media Peor Caso
Selección directa O(n2) O(n2) O(n2)
Burbuja O(n2) O(n2) O(n2)
Burbuja_Mejorado O(n) O(n2) O(n2)
Ord_Mezcla O(nlog2n) O(nlog2n) O(n2)
Ord_Rápida O(nlog2n) O(nlog2n) O(n2)
(depende de orden
de división)
Ord_Shell O(n2) O(n2) O(n2)
Búsqueda Secuencial
Comenzando desde el inicio de la lista se busca registro a registro (elemento a elemento) hasta
encontrar el elemento buscado o en su defecto terminar de revisar toda la estructura. Este tipo
de búsqueda es aplicable a listas secuenciales(arreglos) y listas enlazadas.
29
Begin
End;
Consideraciones
• En el peor de los casos, deberíamos buscar en el último registro de la lista o sobre uno
no existente. O(N)
• En promedio, si supusiéramos igual probabilidad de búsqueda para cualquier item, se
harían N/2 comparaciones (mitad de la lista)
• Si la lista estuviese ordenada (en base al campo clave) la eficiencia del algoritmo
anterior se vería mejorada ya que detendríamos nuestra búsqueda cuando se haya
sobrepasado su posición lógica dentro de la lista.
Búsqueda Binaria
------------------------------------------------------------------------
Var
indice: integer;
puntomedio, primero, ultimo: integer;
Encontrado: boolean;
Begin
ENCONTRADO:= FALSE; primero:= 1;ultimo:= numelementos;
30
else
begin
if lista[puntomedio] > valclave then ultimo:=puntomedio-1
else primero:= puntomedio +1;
end;
end;
End;
Búsqueda Hash
¿Cómo poder mejorar la eficiencia de los algoritmos antes mencionados?, ¿será posible
encontrar un algoritmo más eficiente que de O(log2 n) ? Supongamos que se tiene una lista de
empleados con el campo RUT como clave ¿sería factible tener un arreglo con 15.000.000
posiciones?.
Lo lógico sería tener un arreglo con el tamaño realmente necesario (por ejemplo 0..99) y
ordenar los elementos en base a los dos últimos dígitos del RUT. Por ejemplo, al empleado con
RUT 10905867 le correspondería la posición 67 del arreglo y a otro con RUT 18632655 la
posición 55. De esta forma, sería posible decir que los elementos se encuentran ordenados en
base a una función aplicada sobre el campo clave. Dicha función tiene dos objetivos, el primero:
ser utilizada como un medio de direccionamiento mediante la cual es posible ordenar la lista (es
decir, decidir en qué lugar del arreglo se almacenará un elemento determinado) y el segundo:
ser utilizada como método de acceso al registro. A esta función se le denomina Función HASH o
de Hashing, para el caso anterior la función sería f(clave) = clave MOD 100, donde el remanente
del cuociente entre la clave y 100 genera la posición de almacenaje.
Las funciones de Hashing más comunes utilizan el método de la división (MOD) para calcular las
direcciones transformadas. La forma general es:
31
DireccionHash := Clave MOD TamañoLista
Otro método más sofisticado es dividir la clave, en notación binaria, en varios trozos y
concatenarlos mediante un XOR (OR exclusivo). Supongamos que deseamos construir una
función de HASH que nos genere índices entre 0 y 255 y la representación interna de la clave es
de 32 bits., se necesitan 68 bits para representar los 256 valores de índices. Por ejemplo, para
la clave 618403, cuya representación binaria es 00000000000010010110111110100011,
dividiéndola en grupos de 8 bits se obtendría:
00000000
00001001
01101111
10100011
O exclusivo entre la primera y la última, las centrales y los resultados de éstas resulta 11000101
que representa el número decimal 197, por lo cual se transforma en el índice 197.
• Colisiones
Cabe destacar que este esquema no garantiza unicidad de índices ya es posible que para dos
RUT distintos la función devuelva la misma posición dentro del arreglo de registros. A este
problema se le denomina colisión, en la práctica es imposible evitarla en un 100%, sin embargo,
es posible minimizarlas y manejarlas.
Una de las formas que se tiene para minimizar las colisiones es utilizar una estructura de datos
que tenga más espacio que el realmente necesario, con la intención de ampliar la función de
hashing. Por ejemplo si se mantiene e una serie de registro sobre un arreglo que contiene el
doble de espacio que empleados, se tendrán la mitad de colisiones que si se tuviera la misma
cantidad. (Otra de las formas de minimizar estas colisiones es cuando el tamaño de la lista es
primo.)
• Encadenamiento
Otra solución es mantener por cada elemento un puntero para generar (eventualmente) una
lista enlazada con todos aquellos elementos para los cuales la función Hash devuelve la misma
posición. (Se debe mantener un arreglo de punteros)
32
• Rehashing
Una tercera solución llamada Rehashing, se utiliza una dirección transformada como entrada a la
función Rehash y se calcula una nueva dirección. Si [clave mod 100]está ocupada, podemos
utilizar la función (Direccion +1) mod100 para producir una nueva dirección. En nuestro primer
ejemplo la clave 10567804 genera la dirección 4 que ya se encuentra ocupada, así, aplicando la
función Rehash (04+1) MOD 100 =5, si está desocupado almacenamos el nuevo elemento allí
sino nuevamente utilizamos la función Rehash con entrada 5. Para la función Rehash podemos
utilizar:
(clave +constante) MOD numero de espacios
Mientras constante y números de espacios sean primos entre sí (1 como único divisor
común) esta función producirá sucesivas transformaciones que cubrirán eventualmente todo el
arreglo.
ARCHIVOS
Introducción
Definición y Componentes
Estructura de datos permanente compuesto por registros (filas) y éstos a su vez por campos
(columnas). Se caracteriza por tener un tipo de dato asociado, el cual define su estructura
interna.
33
Estructura de datos permanente no estructurado formado por una secuencia de caracteres
ASCII.
Var
R : reg_archivo; {Declaración de variables asociadas al archivo}
A : File of reg_archivo; {Nombre lógico del archivo}
Program prueba;
Type
Reg_archivo = Record
Key : Integer;
Data : String[20];
End;
Var
R : reg_archivo;
A : File of reg_archivo;
I : Integer;
Begin
For i:= 1 to 10 do
Begin
Write('ingrese clave ',i:2,':');
readln(r.key);
Write('Ingrese datos: ');
readln(r.data); {se ingresa la información correspondiente al registro utilizado por el programa}
write(a,r) {se ‘traspasa’ el registro al archivo definido (al buffer asociado)}
End;
34
read(a,r); {se lee del archivo a el registro indicado por el puntero, traspasando los datos
al registro r y el puntero avanza al siguiente registro}
writeln(r.key,' ',r.data);
End;
Secuencial
Se accesan uno a uno los registros desde el primero hasta el último o hasta aquel que cumpla
con cierta condición de búsqueda. Se permite sobre archivos de Organización secuencial y
Secuencial Indexada.
Random
Dinámico
Directo
Es aquel que utiliza la función de Hashing para recuperar los registros. Sólo se permite para
archivos con Organización Relativa.
La siguiente tabla resume las distintas denominaciones dadas a los archivos según la utilización
dada:
35
Históricos Registran acontecimientos a Registros de
través del tiempo. movimientos diarios de
CC en un Sistema
Bancario de CC.
De referencia Corresponden a los archivos de Registro % imposiciones
consultas de parámetros. % descuentos isapre,
etc.
Informes o Son respuestas del sistema Planillas de sueldos en
Reportes computacional cuyos contenidos un sistema de
deben ser interpretados por Remuneraciones.
personas. Pueden ser en forma
escrita, por pantalla e incluso
hacia algún archivo con formato
editable.
Secuencial
Es la organización más común. Los registros se almacenan uno tras otro por orden de llegada.
Para accesar un registro determinado se deben leer todos los registros que están almacenados
antes que él.
Se recomienda: para archivos de procesamiento batch (aquellos para los cuales se debe
realizar la misma operación sobre la mayor parte de sus registros)
Secuencial Indexada
Los registros son almacenados en una distribución tal que permiten ser consultados a través de
índices. En ellos se distinguen 3 áreas de almacenamiento:
3.De overflow: Encargada de recibir aquellos registros que no pueden ser almacenados en el
área primaria.
Relativa
Existe una relación directa entre la ubicación lógica de un registro y su ubicación física. Para ello
necesita una función matemática que asigne a un valor de clave una dirección física única. El
encontrar una Fh óptima es tarea compleja por lo que esta organización es poco utilizada.
Consiste ordenar el archivo a partir de uno o más criterios impuestos sobre sus campos. Es
normal que los archivos estén ordenados por clave o por algún campo alfabético ascendente o
descendentemente
36
Concatenación
Antes de...
Después de...
Intercalación
Consiste en generar un archivo ordenado según algún criterio preestablecido a partir de dos ó
más archivos que pueden o no encontrarse en la misma secuencia.
37
Antes de...
Después de...
Pareamiento
Edición
Consiste en preparar los datos que constituyen a uno ó más archivos para que sean
interpretados por personas. Se asocia generalmente a la generación de listados en papel
impreso.
38
Validación
Consiste en asegurar la veracidad e integridad de los datos que ingresan a un archivo. Existen
numerosas técnicas de validación tales como: Dgito verificador, chequeo de tipo, chequeo de
rango.
Actualización
Consiste en agregar y eliminar registros desde un archivo, así como también modificar el valor
de uno ó más campos. También se conoce como mantención de uno o más archivos.
Bases de Datos
• Las aplicaciones que permiten administrar una base de datos se denominan DBMS (Data
Base Manager System), entre ellos podemos citar a: Access, SQL Server, ORACLE Server
etc. Estas œltimas se conocen también como RDBMS (Relational Data Base Manager
System) ya que siguen el enfoque relacional.
• En general, el diseño de las bases de datos se rige según ciertas normas, algunas
creadas por E. Codd permiten evitar redundancias, e inconsistencias como consecuencia
del proceso de actualización. Estas reglas son las denominadas FORMAS NORMALES.
P: Primary Key
F: Foreing Key
Notar que existe una relación entre las tablas reparación y producto representada la tabla
relación prod_reparpor, debido a que en una reparación se pueden utilizar varios productos
como insumos y éstos a su vez pueden participar en más de una reparación.
39
Formas Normales
Finalmente, podemos decir que estas formas normales también son aplicables al diseño de
archivos tradicionales con clave, con lo que abarcaríamos todos los sistemas.
PRIMERA FORMA NORMAL: Bajo la primera formal normal, todas las ocurrencias de un
registro deben contener el mismo número de campos. La primera forma normal excluye campos
de repetición variable.
Este registro transgrede la primera forma normal, debido a que pueden existir varios autores
para un mismo libro (igual sucede con el campo materia). Una solución a este problema separa
los campos "conflictivos", agrupándolos en otras tablas:
Cod_lib Autor
SEGUNDA FORMA NORMAL: Todo campo no clave debe depender directamente del campo
clave.
Ejemplo:
40
BIBLIOGRAFÍA
Utilizada
• Susan Lily & Nell Dale, Estructuras de Datos, Mc Graw Hill, 1995
• Cairó & Guardati, Pascal y Estructuras de Datos, Mc. Graw Hill 2» edición, 1989
• Niklaus Wirth, Algoritmos + Data Structures = Programs, Prentice Hall, 1976
• Joyanes, Programación en Turbo/Borland Pascal 7, 3» Edición, 1997
Recomendada
• Susan Lily & Nell Dale, Estructuras de Datos, Mc Graw Hill, 1995
• Luis Joyanes, Problemas de Metodologías de Programación 2a edición, Mc. Graw
Hill, 1989
• Cairó & Guardati, Pascal y Estructuras de Datos, Mc. Graw Hill 2a edición, 1989
• Niklaus Wirth, Algoritmos + Data Structures = Programs, Prentice Hall, 1976
• Joyanes, Programación en Turbo/Borland Pascal 7, 3a. Edición, 1997
INTERNET
• http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/abstrac.htm
• http://guiafe.com.ar/aedd/teoria.htm
• http://www.programmersheaven.com/
• http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/EJ_PILAS.HTM
[Recursividad]
• http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/recursiv.htm
• http://193.145.249.7/Informat2/clases/list_vincs/sld0003.htm
[Arboles Binarios]
• http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/EJ_ARBIN.HTM
[Ordenamiento]
• http://dgicii.mty.itesm.mx:8095/%7Empadilla/Estructura/sorts.htm
• http://www.cc.ece.ntua.gr/%7Egkaval/applets/sortdemo.html
41
Glosario
Biblioteca: Es el archivo que contiene las funciones estándares que se pueden usar en los
programas. Estas funciones incluyen todas las operaciones de entrada/salida (E/S), manejo de
pantalla en modo texto o modo gráfico así como otras rutinas útiles.
Caché: Una porción de memoria en donde se ubica la información utilizada con mayor frecuencia
para permitir un acceso más rápido.
CASE: "Computer Aided Software Design". Herramienta Computacional que apoya a alguna de
las fases del desarrollo del Sw
Chip (o Ship): Pastilla de silicona quer contiene circuitos eléctricos en miniatura que pueden
almacenar millones de bits de información.
Ciber Espacio: Parte de la sociedad y cultura humana que existe en los sistemas de
computadores conectados en red, a diferencia de las comunidades con una ubicación física
definida.
Cliente: Usuario de una aplicaciíon en red ejecutada desde un servidor. Una arquitectutra
cliente servidor permite un gran número de individuos conectados a la vez. El componente
principal de programa reside en un servidor centralizado, con componentes más pequeños
(interfaz del usuario) en cada cliente.
Código Fuente: Es el texto que un usuario puede leer. Normalmente considerado como el
programa.
Código Objeto:Es la traducción del código fuente de un programa a código máquina, que es el
que la Computadora puede leer y ejecutar directamente. El Código Objeto es la entrada al
enlazador.
Cuadro de diálogo: Ventana que aparece y requiere entrada de datos por parte del usuario (las
más básicas muestran sólo un mensaje). Cuando el usuario completa la información necesaria o
hace click en los botones correctos, el cuadro de diálogo desaparece.
42
DML: Data Manipulanting Language. Lenaguaje provisto por los Administradores de bases de
Datos para la manipulación de las tablas que conforman una Base de Datos.Por ejemplo: SQL
Eficiencia:Se dice que un proceso es eficiente, si es eficaz y adem·s utiliza una mÌnimo de
recursos.
Enlazador: Es un programa que enlaza funciones compiladas por separado para producir un solo
programa (Combina las funciones de biblioteca est·ndar con el cÛdigo que se ha escrito). La
salida del Enlazador es un programa ejecutable.
E-mail: Mensajes, memos, carta, enviados electrÛnicamente entre los computadores conectados
en red que pueden estar a lo largo de la oficina o alrededor del mundo.
HTML (Hipertext Markup Language) Lenguaje estándar para la creación de documentos en World
Wide Web.
Identificador :Nombre asignado a una variable, procedimiento o función dentro del código
fuente.
MICROSOFT Una de las más grandes compañías editoras de software, fundada en 1975 por Bill
Gates. Creadora de Windows, Word, Excel y otras maravillas.
43
y discos de 32 bits, soporte para el Microsoft Network e Internet y atributos generales de
protección para el disco duro. Como ayuda para la complicada tarea de instalar nuevos
componentes de hardware, Windows 95 usa los atributos del Plug and Play que permiten una
instalación y configuración casi automática de accesorios compatibles.
MODEM: Aparato que le permite a una computadora comunicarse con otras a través de la línea
telefónica. Pueden ser internos y externos. Los internos se encuentran dentro de las
computadoras y usted conecta la línea telefónica a la parte trasera.
Online: Disponible al "instante" desde un computador al cual se está conectado. Por Ejemplo, la
ayuda en línea es información acerca de un tópico que se puede obtener de inmediato en una
ventana en vez de consultar un manual físico.
OS/2Siglas para Operating System/2. Este sistema operativo fue desarrollado originalmente por
Microsoft e IBM en 1987, pero ahora es controlado por IBM. OS/2 cuenta con una interfase
gráfica muy similar a la de Windows; también opera DOS y aplicaciones de Windows, además
de programas diseñados expresamente para OS/2; y es un sistema apto para el uso de redes.
Además, para computadoras 386 y 486, toma ventaja de algunos recursos para darle mayor
velocidad cuando hay varios programas abiertos. A pesar de su excelencia tecnológica, OS/2 aún
está muy retrasado con respecto a Windows y al parecer ahí se quedará.
Portabilidad [Transportabilidad]: Capacidad que tiene un programa o lenguaje para ser cambiado
de plataforma con el mínimo núemro de modificaciones. Tiene relación directa con la
independencia que posee el lenguaje de la máquina.
PATH: Un mapa que le dice a su computadora dónde encontrar cierta información. Usando el
sistema operativo DOS, usted puede utilizar esta instrucción para ejecutar un programa desde
cualquier directorio sin necesidad de hallarse físicamente en el directorio donde se encuentra el
programa.
44
PIRATERÍA: El uso de una copia de un programa sin la autorización de las compañías que lo
desarrollaron. En Estados Unidos es una actividad muy penalizada; pero en México es una de las
más comunes.
PLUG AND PLAY: Diseño de tecnología de software y hardware que permite añadir dispositivos a
una computadora sin mucha complicación para el usuario. Si alguna vez has integrado un
módem, un escáner, una tarjeta de audio o algún otro dispositivo a tu computadora, sabes la
serie de problemas con los que te puedes enfrentar. Con esta tecnología del plug and play,
conectas el dispositivo y la computadora por sí sola define todos los detalles para hacerlo
funcionar.
POSTCRIPT: Es un “lenguaje de descripción de página” (PDL) creado por Adobe Systems para
controlar la impresión de texto y de gráficas. Al utilizarlo el usuario procede como lo haría
normalmente: selecciona estilos, mide los textos, elabora dibujos, etc. El sistema postscript
trabaja automáticamente creando las instrucciones necesarias para formar todos los caracteres y
la información gráfica. Otra ventaja importante de los programas postscript es que los archivos
que ahí se trabajan son compatibles con un gran rango de impresoras. Esto permite al usuario
llevar sus archivos a imprimir, en algún servicio externo de impresión, con alguna resolución que
quizás él no pueda obtener en su propia impresora.
PPM (Páginas por minuto): Unidad usada para medir la cantidad de páginas que una impresora
es capaz de imprimir por minuto. Ocho páginas por minuto es buen número.
PRUEBA ALFA: El primer paso de prueba de verificación para productos de cómputo antes de que
éstos sean lanzados al mercado. Normalmente, los fabricantes de equipo o bien los encargados
de la mercadotecnia de los programas son los responsables de llevar a cabo estas pruebas. Más
adelante, se aplica la prueba beta en la cual ya participa un grupo seleccionado de usuarios.
PUERTO SERIAL: Otra conección menos veloz, pero que permite trasmitir a distancias mayores
por medio de un cable.
45
RAM (random access memory): Cuando usted carga un programa o abre un archivo, la
computadora lee la información del disco y la copia en la memoria gracias a este acceso; luego
utiliza la información en RAM para interpretar y dar salida a los comandos que se le solicite. La
memoria RAM está hecha de chips que guardan la información. Esta se conserva, si no se grava
la información, sólo mientras la computadora esté encendida.
RED: Dos o más computadoras unidas por un cable que permite el intercambio de información.
Existen dos tipos de redes: LAN (Local Area Network), en donde las computadoras se encuentran
en una misma oficina o edificio, y WAN (Wide Area Network), donde las computadoras pueden
encontrarse a miles de kilómetros de distancia.
RESPALDAR: Copiar archivos normalmente de un disco duro a cualquier tipo de diskette o cinta.
Si los archivos originales se dañan por alguna causa, se pueden usar estos respaldos para
restaurarlos a su condición original; por eso es importante tener respaldos actualizados.
Algunos programas crean automáticamente copias que respaldan los archivos del usuario. Estos
respaldos tienen la extensión .bak o .bk! Se graban en el mismo drive y directorio que los
archivos originales
RUIDO: Señales indeseadas que interfieren con la comunicación entre hardware y software. El
ruido en las computadoras es el equivalente al sonido de estática que se puede escuchar en la
radio. Estos sonidos interfieren con lo que no se quiere escuchar, de la misma manera en que el
RUIDO, por ejemplo, dificulta la trasferencia de archivos por vía telefónica o a través de los
cables de una red de computadoras.
SERVIDOR: Es el computador central de una red que está instalada exclusivamente para
alimentar de programas y de información a las "computadoras clientes" que conforman dicha
red. Normalmente es la computadora más grande y con más potencia de toda la red.
SHAREWARE: Programas que pueden ser probados de manera gratuita durante un periodo
determinado. Después de ese lapso, el usuario está obligado legalmente a adquirir el programa
si desea continuar usándolo.
SÍNDROME DEL TÚNEL CARPIANO: Enfermedad de reciente aparición que afecta las muñecas a
causa del repetitivo tecleo en la computadora. Quienes usamos constantemente un teclado
corremos el riesgo de desarrollar esta lesión. Se puede prevenir haciendo constantes pausas
durante el trabajo o usando teclados y aditamentos más cómodos.
Sistema Operativo (S.O.): Programa especializado que tienen por objeto tender un puente entre
el Hw y el Sw de la máquina. Dentro de sus funciones principales se tienen: Definir la interfaz de
usuario y Administrar la CPU y memoria. Ejemplos: Unix, DOS, MacOS
SISTEMA REMOTO: La computadora o red a la cual una computadora se conecta por vía de un
módem. La computadora que se conecta a un sistema remoto se conoce como terminal
remota.SMTPProtocolo de control de transferencia para correo electrónico.
46
TCP/IP:Protocolo de control de transferencia de datos establecido en 1982 como estándar de
Internet.
Transceiver: Aparato que recibe y envía señales (p.ej. para conectar un computador a una red).
Transistor: Componente electrónico básico que detiene o deja pasar las señales eléctricas
dependiendo de las pulsaciones anteriores. Un chip o circuito integrado contiene un gran
números de transistores.
Virus:Sofware que se ejecuta en un PC, Mac o servidor sin control del usuario, con el fin de
dañar la información existente. Se auto-reproduce al ejecutarse, multiplicándose así con gran
facilidad.
World Wide Web (WWW):Red mundial de computadores por la cual se transmiten principalmente
archivos hiper y multimediales.
47