Sie sind auf Seite 1von 20

Estructura de datos Unidad I.

- Tipos de datos

Unidad I Tipos de datos


Antes de comenzar con el análisis de las estructuras de datos, es necesario considerar
qué son los datos y cómo apoyan a los sistemas de información.

Concepto de dato
Un dato es una representación formalizada de entidades o hechos, adecuada para la
comunicación, interpretación y procesamiento por medios humanos o automáticos. Por
ejemplo, en una organización, existen empleados, muebles, etc. Para cada empleado,
hay un número de legajo; para cada mueble, hay un número de inventario, etc. Del
mismo modo, existen representaciones simbólicas de lo que sucede en una
organización. Por ejemplo, si se realiza una venta al contado, esa venta generará
datos como un número de factura, un importe percibido, etc.

El dato es un material de valor escaso o nulo para un individuo en una situación


concreta; es una representación simbólica que por sí misma no reduce la dosis de
ignorancia o el grado de incertidumbre de quien tiene que tomar una decisión.

Dato:: Es un hecho aislado no evaluado ni significativo o bien, insumos o resultados


de un fenómeno.

Información: Es un conjunto de datos homogéneos relacionados entre sí que significa


un aumento de conocimientos importantes para el usuario.

Información es el significado que una persona asigna a los datos.

La información es un dato o un conjunto de datos evaluados por un individuo concreto


que trabaja en un momento dado sobre un problema específico para alcanzar un
objetivo determinado.

La información se genera a partir de un grupo de datos seleccionados para reducir la


dosis de ignorancia o el grado de incertidumbre de quien debe adoptar una decisión.

Fuentes de Información
Cualquier elemento de datos puede participar en la generación de “partes” múltiples de
la información. Es importante su flexibilidad para que puedan ser agregados y
sumados de tal manera que pueda producirse información útil para apoyar las
decisiones oportunamente.

Los datos se deben estructurar correctamente para que sean accesibles y que sirvan
como respuesta a varios tipos de preguntas.

Tipos de datos
El recurso fundamental utilizado por un programa es la memoria. Es en la memoria
donde un programa almacena sus datos e instrucciones. Los datos se almacenan en
localizaciones en la memoria denominadas variables. Cada variable puede
almacenar un solo tipo de dato (entero, real, caracter, booleano, etc.) y requiere de un
identificador para poder tener acceso a su contenido.

1
Estructura de datos Unidad I.- Tipos de datos
Los datos son los objetos de información sobre los que actúa un programa. Un dato
puede ser un simple caracter como 'a', un valor entero tal como 35, un número real tal
como 2.345 o una cadena tal como "algoritmia".

A nivel máquina los datos se representan internamente como una secuencia de bits
(dígitos 0 y 1). Los lenguajes de alto nivel evitan estos manejos internos mediante el
concepto de tipo de dato.

El tipo de dato especifica la naturaleza del dato (caracteriza al conjunto de valores)


que puede almacenar la variable y su capacidad de almacenamiento o tamaño.

Representación de los datos en memoria (bit, byte, caracter y


palabra)
Una de las inquietudes principales en el diseño de las primeras computadoras fue que
tuvieran capacidad de almacenar datos. Para satisfacer ese requisito, primero se
identificaron las propiedades que exhibían algunos materiales, con la finalidad de
aprovecharlas. Pronto, el ser humano observó que habían materiales que podían
exhibir dos estados; era sencillo trabajar con ellos y que algunos de esos materiales
conservan un estado indefinidamente hasta que algo los obliga a cambiar de estado.
Algunos de esos materiales fueron los que contenían hierro y tenían un campo
magnético que giraba en cierta dirección. Esos materiales ferrosos cambiaban la
dirección de su campo magnético cuando se les pasaba una corriente eléctrica en un
sentido. Dadas las características de esos materiales ferrosos, el ser humano llegó a
la conclusión de que podía emplearlos para efectos de almacenamiento.

Lo que se quería era que la computadora representara y procesara internamente


números. Por lo tanto, se hizo una convención sobre las dos direcciones que podían
tener los campos magnéticos en los materiales ferrosos. Una dirección del campo
magnético representaría el número 0 y otra dirección representaría el número 1.

Con lo anterior, existían dos problemas con el manejo de números:

1. El primero de ellos es que sólo se podían representar los dígitos 0 y 1, mientras


que cotidianamente se manejaban 10 dígitos para representar a los números. Para
solucionar este problema, se empleó la base numérica binaria, que sólo tiene
como dígitos, 0 y 1. Después, las reglas que se aplican en la base 10 para
representar un número, también, se aplicaron a la base binaria. Por último, se
diseñaron dos procesos de transformación. Uno de ellos convertía un número en
base 10 a su equivalente en base binaria. El otro convertía un número de base
binaria a su equivalente en base 10.
2. El otro problema fue que con una partícula de material ferromagnético
se podían almacenar dos datos, 0 y 1. Fue por eso que se inventó la
celda de almacenamiento. Se agruparon en una celda de
almacenamiento a varias partículas ferromagnéticas y se convino que
cada estado combinado de las partículas ferromagnéticas
representaría un símbolo o un dato. Por ejemplo, una celda de
almacenamiento de tres partículas tendrá capacidad para exhibir ocho
estados combinados, cada uno en momentos diferentes.

2
Estructura de datos Unidad I.- Tipos de datos
El tamaño de una celda de almacenamiento es el número de partículas magnéticas
que la celda agrupa.

Una celda de almacenamiento tiene capacidad para representar 2 N datos diferentes,


donde N se refiere a su tamaño especificado en bits. Ej. con 3 bits se pueden
representar 23 = 8 datos distintos.

A las celdas de almacenamiento en la unidad central de procesamiento se les


conoce con el nombre de registros. Las que se encuentran en la memoria interna se
les conoce con el nombre de celda de memoria. A las celdas de almacenamiento que
se encuentran en la memoria externa no se les conoce con ningún nombre en
particular.

Generalmente, las celdas de memoria tienen un tamaño de 8 partículas


ferromagnéticas. Esto quiere decir que pueden representar, en momentos diferentes,
hasta 256 datos diferentes.

Bit

Para no seguir usando el término partícula ferromagnética, se usó el término bit en su


lugar, que significa lo mismo (binary digit).

Un bit es la mínima unidad de dato.

Byte

A ocho partículas ferromagnéticas u ocho bits se les conoce con el nombre de byte. El
tamaño del byte depende mucho de la arquitectura de la computadora y del sistema
operativo, ya que en otros países y en otras épocas ha variado su tamaño por la
cantidad de símbolos que necesitan representar.

Caracter

Un caracter es un símbolo (imagen gráfica en realidad) de una tabla de códigos o de


caracteres, la cual depende del Sistema Operativo usado.

Tablas de caracteres o tablas de códigos:

• ASCII: Cada caracter usa 8 bits = 1 byte. Contiene 28 = 256 caracteres. Usado
por MS-DOS.
• UNICODE: Cada carácter usa 16 bits = 2 bytes. Tiene 216 = 65,536 caracteres.
Usado por Windows.

3
Estructura de datos Unidad I.- Tipos de datos
Palabra o Word

Para el caso del tamaño de las celdas de memoria, otra unidad de medida aplicable es
“word” o “palabra” que significa 2 bytes o 16 bits.

Generalmente, las celdas de memoria tienen un tamaño de 1 byte, sin embargo, hay
computadoras que tienen celdas de memoria de 1 word.

Otras Unidades de Medidas de datos

Como en la computadora se usa la base binaria, han surgido unidades de medida de


datos adicionales basadas en la base dos:

Unidad Tamaño
1 Kilobyte (Kb) 1024 bytes 210 bytes
1 Megabyte (Mb) 1024 Kb 220 bytes
1 Gigabyte (Gb) 1024 Mb 230 bytes
1 Terabyte (Tb) 1024 Gb 240 bytes
1 Petabyte (Pb) 1024 Pb 250 bytes
1 Exabyte (Eb) 1024 Eb 260 bytes
1 Zettabyte (Zb) 1024 Zb 270 bytes
1 Yottabyte (Yb) 1024 Yb 280 bytes
1 Brontobyte (Bb) 1024 Bb 290 bytes
1 Geopbyte (Geb) 1024 Geb 2100 bytes

Clasificación de tipos de datos


En la mayoría de los lenguajes de programación los tipos de datos se pueden clasificar
como:

Estándares Numéricos Enteros


Primitivos o Lógicos (boolean) Reales
Simples Caracter (Char)
Cadenas
Enumerados

Tipos de
datos Arreglos (Vectores, Matrices,
Multidimensionales)
No primitivos, Registros
Estructurados, Archivos
Compuestos o Apuntadores o referencias
def. por el
usuario

4
Estructura de datos Unidad I.- Tipos de datos
Tipos simples o primitivos

Estándares:

• Datos Numéricos: pueden representarse en dos formas muy distintas:


como números enteros o como números reales.

 Los enteros (denominados en ocasiones números de punto fijo)


corresponden a números completos; no tienen componentes
fraccionarios o decimales y pueden ser negativos o positivos. Los
siguientes son ejemplos de enteros:

25 5
-8 309
5 321 17
-371 31

 Los reales siempre tienen un punto decimal; las fracciones se


almacenan en la computadora como números decimales, porque no
existe forma de almacenar numeradores y denominadores separados.
Los números reales pueden tomar, teóricamente, cualquier valor de la
recta numérica real y pueden también ser positivos o negativos. Los
siguientes son ejemplos de reales:
225.53 3 739.79
3.8941 –72.987
-8.910 –3.4

En algunas aplicaciones científicas se requiere una representación


especial para manejar números muy grandes, como la masa del Sol; o
muy pequeños, como el espesor de una película muy delgada.

La representación de cualquier número, ya sea entero o real, debe tener


un número fijo de dígitos en la computadora. El número de dígitos
puede variar de computadora a computadora, pero ocho dígitos
significativos es un número típico. Lo cual significa un problema para
almacenar números como 3 863 213 632 o 0.00000002857.

Los científicos han resuelto este problema con una notación especial,
en la cual se usa un cierto número de dígitos de exactitud (o de
precisión), seguidos por la magnitud del número que se expresa como
una potencia de 10.
Por ejemplo, puede representar 3 863 213 632 con cuatro dígitos de
precisión en la forma 3.864 * 109.
3.864 * 109
Dígitos de magnitud
exactitud

Los números representados de en esta forma se denominan números


de punto flotante.

Para representar 3 863 213 632 con cuatro dígitos de precisión se


realiza lo siguiente:

Tenemos que el número original como

5
Estructura de datos Unidad I.- Tipos de datos
3 863 213 632 * 100

Se corre el punto decimal nueve posiciones a la izquierda y por cada


posición recorrida se suma una unidad al exponente.

3 863 213 632 = 3.863 * 109

Para representar el número 0.0065 con dos dígitos de precisión se


realiza lo contrario, se corre el punto decimal tres posiciones a la
derecha y por cada posición recorrida se resta una unidad al exponente.

0.0065 * 100
0.0065 = 6.5 * 10-3

• Lógicos o booleanos: Verdadero o falso que representan el resultado de


una comparación entre otros datos (numéricos o alfanuméricos).

• Caracter: Un sólo caracter alfanumérico, actualmente de la tabla de


caracteres Unicode.

• Datos Cadena (String): Es una secuencia de caracteres alfanuméricos


que permiten representar valores identificables de forma descriptiva, esto
incluye nombres de personas, direcciones, etc. Es posible representar
números como alfanuméricos, pero estos pierden su propiedad matemática,
es decir no es posible hacer operaciones con ellos. Este tipo de datos se
representan encerrados entre comillas.

Ejemplo:
“Materia Fundamentos de Programación”
“2004”

Tipos No primitivos, Estructurados, Compuestos o Definidos por el usuario:

• Arreglos (Arrays): Los arreglos son una colección de variables del mismo
tipo (primitivas o estructuradas) que se referencían utilizando un nombre
común. Un arreglo puede tener una o varias dimensiones.

 Unidimensionales o Vectores: Usan un solo índice para localizar a sus


elementos. Típicamente se le grafican como una fila o una columna.
Ejemplos:
o Una lista de calificaciones de alumnos.
o Los andenes de una terminal de autobuses.
o Una línea de casilleros de alumnos.
o Una línea de cajas en un supermercado, etc.

 Bidimensionales o Matrices: Usan dos índices. El primer índice hace


referencia a las filas y el segundo a las columnas. Se grafican como un tablero de
filas y columnas.

Ejemplos:
o Un tablero de ajedrez.
o El juego del gato.
o Un casillero de huevos.

6
Estructura de datos Unidad I.- Tipos de datos
o Un tablero de llaves de la recepción de un hotel, donde las filas
son los pisos y las columnas los números de cuarto.
o Una colonia, donde las filas son las manzanas y las columnas
ubican los lotes.

 Multidimensionales: Usan mas de un índice. Los bidimensionales


pertenecen a los multidimensionales. Estos son más difíciles de representar pero se
crean a partir de la agregación de elementos dentro de otros (arreglos dentro de
arreglos).

Ejemplos:
o Tomando como base el ejemplo de la colonia anterior, se podría
pensar agrupar varias colonias y así tener un arreglo tridimensional, donde el primer
índice se usa para ubicar a la colonia, el segundo a la manzana y el tercero al lote.
o Podemos pensar también en representar la estantería de un
supermercado con un arreglo de 3 dimensiones, donde la primera dimensión será
para ubicar el rack (productos para el hogar, comestibles, carnicería, ropa, etc), la
segunda al estante y la tercera, la posición del producto.

• Registros: Un Registro es una colección de variables que se referencian


bajo un único nombre, proporcionando un medio eficaz de mantener junta
la información relacionada. Cada elemento del registro está relacionado
lógicamente con los otros. Por ejemplo:
Registro dir
char nombre[30]
char calle[40]
char ciudad [20]
En java son las clases.

• Archivos: Un archivo es una secuencia finita de bits que representan


datos de un mismo tipo, almacenado en memoria secundaria. Una
colección de registros lógicamente relacionados.

• Apuntadores: Son variables que apuntan a una dirección de memoria, es


decir, el valor que contienen es la dirección de una variable y sirven para
hacer referencia a la dirección de variables de tipo primitivo (el nombre de
una variable de tipo primitivo se usa para accesar al valor que contiene),
porque los nombres de variables de tipos compuestos, por sí mismos ya
son apuntadores.
El nombre de una variable de tipo no primitivo por sí mismo es un
apuntador o referencia para el caso de Java.

Manipulación de bits
Los sistemas operativos, el software para equipo de prueba, el software de red y otros,
requieren comunicarse “directamente con el hardware”. Para ello es necesario bajar al
llamado nivel de “bits y bytes”.

Los operadores utilizados para manipulación de bis son:

Opera Nombre Descripción


dor
& AND a nivel de bits El bit de resultado se pone en 1 si los bits de ambos

7
Estructura de datos Unidad I.- Tipos de datos

operandos son 1.
| OR inclusivo bit por El bit de resultado se pone en 1 si al menos uno de los
bit bits de los operandos es 1.
^ XOR, OR exclusivo El bit de resultado se pone en 1 si y solo si uno de los bits
correspondientes en al menos uno de los operandos es 1.
<< Desplazamiento a Desplaza los bits del primer operando a la izquierda, el
la izquierda núm. de bits especificado por el segundo operando. Se
rellena a la derecha con bits 0.
>> Desplazamiento a Desplaza los bits del primer operando a la derecha, el
la derecha con núm. de bits especificado por el segundo operando. Si el
extensión de signo primer operando es negativo, se introducen unos por la
izquierda; en caso contrario se introducen ceros por la
izquierda.
>>> Desplazamiento a Desplaza los bits del primer operando a la derecha, el
la derecha con núm. de bits especificado por el segundo operando. Se
extensión cero introducen ceros por la izquierda.
~ Complemento a Todos los bits 0 se ponen a 1 y todos los bits 1 se ponen a
unos. Operador 0.
unario.

El comportamiento de estos operadores es presentado a continuación

a b a& a^ a| ~
b b b a
0 0 0 0 0 1
1 0 0 1 1 0
0 1 0 1 1 1
1 1 1 0 1 0

Representación de datos
Representación de enteros

En las computadoras los dispositivos (hardware) trabajan básicamente con dos


estados (0 y 1), comúnmente trabajan con datos representados en binario, octal y
hexadecimal. La representación para cada uno de estas bases se presenta a
continuación:

Binario Octal Hexadecimal Decimal


0 0 0 0
1 1 1 1
10 2 2 2
11 3 3 3
100 4 4 4
101 5 5 5
110 6 6 6
111 7 7 7
1000 10 8 8
1001 11 9 9
1010 12 A 10
1011 13 B 11
1100 14 C 12
1101 15 D 13
1110 16 E 14

8
Estructura de datos Unidad I.- Tipos de datos

1111 17 F 15
10000 20 10 16

Las operaciones en cada una de estas bases son análogas a la base 10. En esta base
por ejemplo, el número decimal 743.57 es calculado:

743.57 = 7 ∗10 2 + 4 ∗101 + 3∗10 0 + 5∗10 −1 + 7 ∗10 −2

Notación sin signo

Es usada para representar enteros no negativos. Estos a su vez no soportan números


negativos o en formato flotante. Un número de n-bits, A, en esta notación es
representado:
n −1
A ≡ a n −1 a n −2  a 0 Con un valor de A = ∑a k 2k a k ∈ { 0,1}
k =0

El rango de un número sin signo es 0 ≤ A ≤ 2 n − 1 . El 0 es únicamente representado


en notación sin signo.

Los siguientes tipos de datos sin signo son usados en el lenguaje de programación C+
+:
• unsigned char (8 bits)
• unsigned short (16 bits)
• unsigned int (native machine size)
• unsigned long (machine dependent)

El número de bits para cada tipo depende de cada tipo de compilador, en la tabla 1 se
presentan los datos para el lenguaje java.

Tabla 1.- Tipos de datos simples en Java

Data Type Data Type Size in Bits Range of Values Group


/ Format
byte 8 /complemento a 2 –128 to 127 Integers
short 16/ complemento a 2 –32,768 to 32,767 Integers
int 32/ complemento a 2 –2,147,483,648 to Integers
2,147,483,647
long 64/ complemento a 2 –9,223,372,036,854,775,808 Integers
to 9,223,372,036,854,775,807
char(Unicode) 16 (Unicode) 65,536 (Unicode) Characters
float 32 IEEE 754 (simple 3.4e-038 to 3.4e+038 Floating-point
precisión)
double 64 IEEE 754 (double 1.7e-308 to 1.7e+308 Floating-point
precisión)
boolean 1 0 or 1 Boolean

Notación con signo

Esta representación es usada para representar números enteros positivos y negativos;


en este tipo de notación no están contemplados los flotantes. Un número A de n-bits,
en notación con signo es representada como:

9
Estructura de datos Unidad I.- Tipos de datos

 n−2 
A ≡ a n −1 a n −2  a 0 Con valor de A = ( −1) an −1  ∑a k 2k  a k ∈ { 0,1}
k =0 
Un numero A, es negativo si y solo si a n −1 =1. El rango de números de n-bits en
notación con signo:
( )
− 2 n −1 −1 ≤ A ≤ 2 n −1 −1

Complemento a dos

Es usado por casi todas las computadoras para representar enteros positivos y
negativos. Un número A, en complemento a dos es representado:
 n− 2 
A ≡ a n −1 a n −2  a 0 Con un valor de A =  ∑a k 2 k  − a n −1 2 n −1 a k ∈ { 0,1}
k =0 

Representación de Flotantes

Muchos estudiantes consideran que el ordenador puede trabajar con números con
cantidades de cifras infinitamente grandes. Este preconcepto es uno de los más
erróneos que se puede detectar en el alumno.

Todo ordenador cuenta con un número finito de Bytes para poder almacenar una cifra.
Este número puede ser de 1, 2, 4, 6, 8, 10 Bytes, pero nunca infinito. Por lo tanto solo
se podrá ingresar, procesar, almacenar y extraer un rango de valores. Por ejemplo
para números enteros se utiliza como máximo 4 Bytes (32 bits), siendo el rango de
representación entre -2147483648... 2147483647.

Coma Flotante
Este método nace de la necesidad de representar números reales o enteros con un
rango mayor que el dado por los otros métodos.
En su representación se utiliza la representación matemática
NO = mantisa * base exponente
Por ejemplo:
79436.54 = 0,7943654 * 105
A este proceso se lo denomina normalización.

Para estos números explicaremos dos formas de representación: simple y doble


precisión, pero existen otros formatos como real, extended o comp.

Para simple precisión se utiliza 32 bits (4 Bytes), en el segundo caso 64 bits (8 Bytes).
(Todos los elementos en computación se comienzan a numerar por 0)
El esquema en ambos casos es como se ve abajo:

Simple Doble Precisión


Precisión
Cantidad de bits
Signo 1 1
Exponente 8 11
Mantisa 23 52

10
Estructura de datos Unidad I.- Tipos de datos
Ejemplos de Decimal a Flotante

57 a Flotante

1) Pasa 57 a Binario
57 ⇒ 111001

2) Se normaliza el binario
111001 ⇒ 0,111001 * 26

3) Pasa el exponente a binario


6 ⇒ 110
4) Si es en Simple Precisión (SP) se expresa como excedente a 10000000 (por los 8
bits), si es en Doble Precisión como excedente a 10000000000 (por los 11 bits). El
exponente queda así:

SP 10000110

DP 10000000110

5) Como el número es positivo, el bit de signo es 0


El número queda estructurado de la siguiente manera
Signo Exponente Mantisa
SP 0 10000110 111001

El número en cuestión queda

0100 00110111 0010 0000 0000 0000 0000

1 8 23

6) Se pasa a HEXADECIMAL y queda


437216

En el caso de - 57

7) Como el número es negativo el bit de signo es 1


El número queda estructurado de la siguiente manera
Signo Exponente Mantisa
SP 1 10000110 111001

El número en cuestión queda


1100 0011 0111 0010 0000 0000 0000 0000

1 8 23

8) Se pasa a HEXADECIMAL y queda:


C37216

Ejemplo de exponente negativo

11
Estructura de datos Unidad I.- Tipos de datos

El número 0.13671875. Repito los pasos anteriores.

Paso a binario
0.13671875 ⇒ 0.00100011

Normalizo
0.001000112 ⇒ 0.1000112 *2-2

Se pasa el módulo de la potencia a Binario:


2 ⇒ 102

Si es de Simple Precisión (SP) se expresa como antecedente a 10000000 ( resta). El


exponente queda así:

SP 01111110
Como el número es positivo, el bit de signo es 0.
El número queda estructurado de la siguiente manera:

Signo Exponente Mantisa


SP 0 01111110 100011

El número en cuestión nos queda:


0011 1111 0100 0 1100 0000 0000 0000 0000
(No se completó con ceros porque su representación en hexadecimal son 0 que no
afectan el número final)

Lo paso a HEXADECIMAL y nos queda:


3F4616

Si el número fuera negativo el bit de signo es 1.

El número queda estructurado de la siguiente manera:

Signo Exponente Mantisa


SP 1 01111110 100011
Debería agrega 0 hasta completar los 23 bits

El número en cuestión nos queda:


1011 1111 0100 0110

Lo paso a HEXADECIMAL y nos queda:


BF4616

Si el número (-0,13671875) quisiéramos expresarlo en flotante de 64 bits, el único


cambio que tendríamos sería el exponente que ya no tiene 8 bits sino 11 bits,
quedándonos.

El número queda estructurado de la siguiente manera:

Signo Exponente Mantisa

12
Estructura de datos Unidad I.- Tipos de datos
SP 1 01111111110 100011

El número en cuestión nos queda:


1011 1111 1110 1000 1100

Lo paso a HEXADECIMAL y nos queda:


BFE8C16

Como se puede ver el mismo número según se represente en 32 o en 64 bits

32 bits 64 bits
-0,13671875 BF460000 BFE8C00000000000
Los ceros a la izquierda no son representativos, pueden o no escribirse.
Este método de representación tiene sus rangos de representación los cuales no
incluyen el número 0 (cero). Se puede representar números muy próximos a 0 pero no
incluye este número.
El módulo mayor que se puede expresar en doble precisión es 1,710 * 10308, con una
precisión de 15 a 16 cifras. El número más próximo a cero será 1 * 10 -309. El módulo
mayor que se puede expresar en punto flotante (extended) es 1,10 * 104932.

Codificación alfanumérica

Cada vez que presionamos una tecla cualquiera en nuestra computadora, esta
convierte el carácter presionado en un conjunto bits. Para esta transformación se
utilizaron y se utilizan distintos códigos.
El primero fue un código de 6 bits denominado FIELDATA. Es código fue reemplazado
por el ASCII (American Standard Code for Information Interchange) que era un código
de 7 bits (tenía 128 caracteres posibles), luego aparece el EBCDIC que fue el primer
código de 8 bits por último aparece para el ambiente de PC el ASCII extendido que
también es de 8 bits (256 caracteres). Actualmente los modernos sistemas operativos
manejan el UNICODE de 16 bits (65,536 caracteres).

Tipos de Datos Abstractos


Un Tipo de dato abstracto (en adelante TDA) es un conjunto de datos u objetos al cual
se le asocian operaciones. El TDA provee de una interfaz con la cual es posible
realizar las operaciones permitidas, abstrayéndose de la manera en como estén
implementadas dichas operaciones. Esto quiere decir que un mismo TDA puede ser
implementado utilizando distintas estructuras de datos y proveer la misma
funcionalidad.

El paradigma de orientación a objetos permite el encapsulamiento de los datos y las


operaciones mediante la definición de clases e interfaces, lo cual permite ocultar la
manera en cómo ha sido implementado el TDA y solo permite el acceso a los datos a
través de las operaciones provistas por la interfaz.

Manejando los Problemas

La primera cosa con la que uno se enfrenta cuando se escriben programas es el


problema. Típicamente, tú te enfrentas a problemas "de la vida real" y te quieres
facilitar la existencia por medio de un programa para dichos problemas. Sin embargo,
los problemas de la vida real son nebulosos y la primera cosa que tienes que hacer es

13
Estructura de datos Unidad I.- Tipos de datos
tratar de entender el problema para separar los detalles esenciales de los no
esenciales: Tratas de obtener tu propia perspectiva abstracta, o modelo, del problema.
Este proceso de modelado se llama abstracción y se ilustra en la Figura 2.

Figura 2: Crear un modelo de un problema por abstracción.

El modelo define una perspectiva abstracta del problema. Esto implica que el modelo
se enfoca solamente en aspectos relacionados con el problema y que tú tratas de
definir propiedades del problema. Estas propiedades incluyen

• los datos que son afectados


• las operaciones que son identificadas por el problema.

Como ejemplo considera la administración de empleados en una institución. Tu


superior viene y te pide que elabores un programa que permita administrar a los
empleados. Bueno, esto no es muy específico. Por ejemplo, ¿Qué información de los
empleados necesita la administración?, ¿Qué tareas deberían ser permitidas? Los
empleados son personas caracterizadas por muchas propiedades, unas pocas son:

• nombre,
• tamaño,
• fecha de nacimiento,
• forma,
• número social,
• número de cuarto,
• color de pelo,
• pasatiempos.

Ciertamente que no todas estas propiedades son esenciales para resolver el problema
de la administración. Solamente algunas de ellas son específicas del problema. En
consecuencia, creas un modelo de un empleado para el problema. Este modelo solo
implica propiedades que son necesarias para cumplir con los requerimientos de la
administración, por ejemplo el nombre, fecha de nacimiento y el número social. A
estas propiedades se les llama los datos del modelo (de empleado). Ahora ya se
tienen descritas a las personas reales por medio de un empleado abstracto.

Desde luego, la pura descripción no es suficiente. Debe haber algunas operaciones


definidas con las cuáles la administración sea capaz de manejar los empleados
abstractos. Por ejemplo, debe haber una operación que te permita crear un empleado

14
Estructura de datos Unidad I.- Tipos de datos
nuevo una vez que una persona ingrese a la institución. Consecuentemente, tienes
que identificar las operaciones que deberían ser posibles de ser ejecutadas en un
empleado abstracto. Decides también permitir el acceso a los datos del empleado
solamente por medio de operaciones asociadas. Esto te permite asegurarte que los
elementos de datos siempre estén en un estado apropiado. Por ejemplo, poder
verificar si una fecha provista es válida.

Para resumir, la abstracción es la estructuración de un problema nebuloso en


entidades bien definidas por medio de la definición de sus datos y operaciones.
Consecuentemente, estas entidades combinan datos y operaciones. No están
desacoplados unos de otras.

Propiedades de los Tipos de Datos Abstractos

El ejemplo de la sección anterior muestra que por medio de la abstracción por lo tanto
se crea una entidad bien definida que puede ser adecuadamente manejada. Estas
entidades definen la estructura de datos de un conjunto de elementos. Por ejemplo,
cada empleado administrado tiene un nombre, fecha de nacimiento y número social.

La estructura de los datos puede ser accesada solamente por medio de operaciones
definidas. Este conjunto de operaciones es conocida como interface y es exportada
por la entidad. Una entidad con las propiedades recién descritas se conoce como un
tipo de datos abstracto (TDA).

La Figura 3 muestra un TDA que consiste en una estructura de datos abstracta y


operaciones. Solamente las operaciones son visibles desde afuera y definen la
interface.

Figura 3.2: Un tipo de datos abstracto (TDA).

Una vez que un nuevo empleado es "creado", la estructura de datos es llenada con los
valores reales. Ahora tú tienes una instancia de un empleado abstracto. Tú puedes
crear tantas instancias de un empleado abstracto como sea necesario para describir
cada una de las personas empleadas.

Las características de un TDA en un modo más formal:

Definición (Tipo de Datos Abstracto) Un tipo de datos abstracto (TDA) se


caracteriza por las siguientes propiedades:

1. Exporta un tipo.
2. Exporta un conjunto de operaciones. Este conjunto es llamado interface.
3. Las operaciones de la interface son el único y exclusivo mecanismo de acceso a la
estructura de datos del TDA.
4 Axiomas y precondiciones definen el ámbito de aplicación del TDA.

15
Estructura de datos Unidad I.- Tipos de datos
Con la primera propiedad es posible crear más de una instancia de un TDA como se
pudo ver con el ejemplo de la administración de empleados

Importancia del encapsulamiento de la estructura de los datos

El principio de esconder la estructura de los datos usada y solamente para proveer


una bien definida interface se conoce como encapsulamiento. ¿Por qué es tan
importante encapsular la estructura de los datos?

Para contestar a esta pregunta, considera el siguiente ejemplo matemático donde


queremos definir un TDA para números complejos. Para esto, es suficiente saber que
los números complejos constan de dos partes: la parte real y la parte imaginaria.
Ambas partes están representadas por números reales. Los números complejos
definen varias operaciones: suma, resta, multiplicación o división por nombrar algunas.
Los axiomas y precondiciones son válidos tal y como están definidos por la definición
matemática de los números complejos. Por ejemplo, existe un elemento neutral para la
adición.

Para representar un número complejo es necesario definir la estructura de datos que


va a ser usada por su TDA. Uno puede pensar en al menos dos posibilidades para:

• Ambas partes son almacenadas en un arreglo doble, donde el primer valor


indica la parte real y el segundo valor la parte imaginaria del número complejo.
Si x detenta la parte real mientras que y la parte imaginaria, tú podrías pensar
en accesarlos vía subíndices de arreglos: x=c[0] y y=c[1].
• Ambas partes son almacenadas en un registro doble. Si el nombre del
elemento de la parte real es r y el de la parte imaginaria es i, x y y pueden ser
obtenidos con: x=c.r y y=c.i.

El Punto 3 de la definición del TDA dice que para cada acceso a la estructura de los
datos debe haber una operación definida. Los ejemplos de acceso de arriba parecen
contradecir este requisito. ¿Es esto realmente cierto?

Veamos otra vez las dos posibilidades para representar números complejos.
Pensemos únicamente en la parte real. En la primera versión, x es igual a c[0]. En la
segunda versión, x es igual a c.r. En ambos casos x es igual a "algo". Es este "algo" el
que difiere en la estructura de datos actual que se está usando. Pero en ambos casos,
la operación ejecutada "igual a" tiene el mismo significado para declarar que x es igual
a la parte real del número complejo c: ambos casos logran la misma semántica.

Si tú piensas en operaciones más complejas, el impacto de desacoplar estructura de


datos y operaciones se hace aún más evidente. Por ejemplo la suma de dos números
complejos requiere que ejecutes una suma para cada parte. Por consecuencia, tú
debes accesar el valor de cada parte, el cuál es diferente para cada versión. Al
proveer una operación "suma" tu puedes encapsular estos detalles aparte de su uso
actual. En el contexto de una aplicación tú simplemente "sumas dos números
complejos" sin importar cómo se logra en la práctica esta funcionalidad.

Una vez que has creado un TDA para números complejos, digamos Complex, tu
puedes usarlo de la misma manera que se usan los tipos de datos conocidos tales
como los enteros (integers).

Resumiendo: La separación de las estructuras de los datos y las operaciones por una
parte y la restricción de solamente accesar la estructura de los datos vía una bien

16
Estructura de datos Unidad I.- Tipos de datos
definida interface por la otra, te permite escoger estructuras de datos apropiadas para
el ambiente de la aplicación.

Tipos Genéricos de Datos Abstractos

Los TDAs se usan para definir un nuevo tipo a partir del cuál se pueden crear
instancias. Algunas veces estas instancias deberían operar del mismo modo sobre
otros tipos de datos. Por ejemplo, uno puede pensar en listas de manzanas, carros o
aún listas. La definición semántica de una lista siempre es la misma. Solamente el tipo
de los elementos de datos cambia de acuerdo al tipo sobre el cuál debía operar la
lista.

Esta información adicional podría ser especificada por un parámetro genérico que es
especificado al momento de la creación de la instancia. Así, una instancia de un TDA
genérico es en la práctica una instancia de una variante particular del TDA. Una lista
de manzanas puede ser por lo tanto declarada como sigue:

List<Apple> listOfApples;

Los corchetes angulares encierran ahora el tipo de datos para el cuál una variante del
TDA genérico List sería creada. listOfApples ofrece la misma interface que cualquiera
otra lista, pero opera en instancias del tipo Apple.

Notación

Debido a que los TDAs proveen una perspectiva abstracta para describir propiedades
de conjuntos de entidades, su uso es independiente de un lenguaje de programación
en particular. Se presenta aquí por lo tanto una notación. Toda descripción de un TDA
consiste en dos partes:

• Datos: Esta parte describe la estructua de los datos usada en el TDA de una
manera informal.
• Operaciones: Esta parte describe las operaciones válidas para este TDA, por
lo tanto, describe su interface. Usamos la operación especial constructor para
describir las acciones que se van a ejecutar una vez que una entidad de este
TDA es creada y destructor para describir las acciones que se van a efectuar
cuando una entidad es destruída. Son dados para cada operación, los
argumentos provistos así como precondiciones y postcondiciones.

Se presenta como ejemplo la descripción del TDA Integer. Sea k una expresión
integer:

TDA Integer :

Datos
Una secuencia de dígitos que opcionalmente presentan como prefijo un signo
más o un signo menos. Nos referimos a este número entero con signo como N.
Operaciones
constructor
Crea un nuevo integer.
add(k)
Crea un nuevo integer, suma de N y k.

17
Estructura de datos Unidad I.- Tipos de datos
Por consecuencia, la postcondición de esta operación es sum = N+k. ¡No
confundir esto con los enunciados de asignación tal como se usan en los
lenguajes de programación! Es más bien una ecuación matemática que da
"verdadero" por cada valor sum, N y k después que add ha sido ejecutada.

sub(k)
Similar a add, esta operación crea un nuevo integer de la diferencia de ambos
valores integer. Por lo tanto la postcondición para esta operación es sum = N-k.
set(k)
Pone a N lo que vale k. La postcondición para esta operación es N = k.
...
end

La descripción de arriba es una especificación para el TDA Integer. Nótese por favor,
que usamos palabras para nombres de operaciones tales como "add". Podríamos
haber usado el signo "+", que es más intuitivo, pero ésto podría llevar a alguna
confusión: se debe distinguir la operación "+" de el uso matemático de "+" en la
postcondición. El nombre de la operación es solamente sintaxis ahí donde la
semántica se describe por las pre- y postcondiciones asociadas. Sin embargo, siempre
constituye una buena idea el combinar ambos para hacer que la lectura de las
especificaciones del TDA sea más fácil.

Los lenguajes de programación reales son libres de escoger una implementación


arbitraria para un TDA. Por ejemplo, podrían implementar la operación add con el
operador infijo "+" que condujera a una lectura más intuitiva para la suma de enteros.

Tipos de Datos Abstractos y Orientación a Objetos


Los TDAs permiten la creación de instancias con propiedades bien definidas y
comportamiento bien definido. En orientación a objetos, nos referimos a los TDAs
como clases. Por lo tanto, una clase define las propiedades de objetos instancia en un
ambiente orientado a objetos.

Los TDAs definen la funcionalidad al poner especial énfasis en los datos involucrados,
su estructura, operaciones, así como en axiomas y precondiciones.
Consecuentemente, la programación orientada a objetos es "programación con TDAs":
al combinar la funcionalidad de distintos TDAs para resolver un problema. Por lo tanto,
instancias (objetos) de TDAs (clases) son creados dinámicamente, usados y
destruídos.

Estructuras de datos

En programación, una estructura de datos es una forma de organizar un conjunto de


datos elementales con el objetivo de facilitar la manipulación de estos datos como un
todo y/o individualmente.

Una estructura de datos es una clase de datos que se puede caracterizar por su
organización y operaciones definidas sobre ella. Algunas veces a estas estructuras se
les llama tipo de datos.

Estructuras primitivas y simples

Las estructuras primitivas no están compuestas por otras estructuras de datos. Por
ejemplo los enteros, boléanos, y caracteres.

18
Estructura de datos Unidad I.- Tipos de datos
Las estructuras de datos simples se construyen a partir de estructuras primitivas y son:
cadenas, arreglos y registros. En la tabla 2 se encuentra resumidas las estructuras que
se pretenden cubrir a lo largo de este curso

Tabla 2. Estructuras de datos.


Datos Estructuras Estructuras Compuestas
primitivos Simples
Lineales No lineales
Enteros Cadenas Pilas Árboles
Boléanos Arreglos Colas Grafos
Carácter Registros Listas
ligadas

Clasificación

Pueden realizarse diferentes clasificaciones. Atendiendo al tipo de los datos que la


componen:
• homogéneas, cuando todos los datos elementales que la forman son del
mismo tipo. Por ejemplo:
complejo formado por una pareja de datos reales.
fecha compuesto por tres enteros.
• heterogéneas, en caso contrario. Por ejemplo:
dirección formado por cadenas de caracteres (calle, población,...), y por
enteros y caracteres (portal, piso y letra, ...).

Si en lo que nos fijamos es en la forma en que se almacenan y se gestionan en


memoria las estructuras de datos:

• estáticas si poseen un número fijo de elementos. Los ejemplos más típicos


son los arrays y registros. Su mayor desventaja es la necesidad de tener que
definir el número máximo de elementos que podrá tener la estructura. Su
mayor ventaja es la rapidez de acceso a cada elemento individual de la
estructura.
• dinámicas si el número de elementos que contienen puede variar durante la
ejecución del programa. Su principal inconveniente es la lentitud en el acceso,
ya que normalmente se realiza de forma secuencial. La ventaja es sin embargo
importante, la posibilidad de aumentar o disminuir en tiempo de ejecución el
número de elementos que componen la estructura.

Por la forma de acceder a la estructura de datos encontramos:

• acceso por nombre, es decir, para acceder a cada elemento de la estructura


de datos es necesario conocer el nombre (p. e. los registros).
• acceso por posición, donde para acceder a un elemento de la E. D. o bien se
conoce su posición, o bien el acceso se reduce a ciertos elementos (el primero,
el último, etc.). Ejemplos pueden ser las estructuras matriciales (matrices,
vectores, etc.), las Pilas y las Colas.
• acceso por clave, en la que para acceder a un determinado elemento es
preciso conocer únicamente el contenido de uno de sus campos, normalmente
llamado clave. Ejemplos son todas las estructuras ordenadas por su contenido,
como es el caso de los árboles.

A continuación se presenta las estructuras de datos típicas y más utilizadas en la


Programación de ordenadores.

19
Estructura de datos Unidad I.- Tipos de datos

Fuentes de información:

Data Structures & Algorithms in Java by Robert Lafore, ISBN: 1571690956


Sams, 1998.

ALGORITHMS AND DATA STRUCTURES IN C++ by Alan Parker, ISBN:


0849371716, CRC Press, 1993.

ESTRUCTURA DE DATOS Y ORGANIZACIÓN DE ARCHIVOS by Mary E. S.


Loomis, ISBN: 9688801909, Segunda edición, Addison Wesley, 1991.

20

Das könnte Ihnen auch gefallen