Info 3
Info 3
Info 3
1
Introducción
Un apoyo que tiene el proceso enseñanza-aprendizaje, es precisamente el
material didáctico, ya sea a través de apuntes, cuaderno de ejercicios, libros o
aplicaciones de computadora, sobre todo si se trata de un área tan dinámica
como lo es la de la Informática.
Estos ejercicios pueden ser de apoyo para esta asignatura, pretendiendo dar
material para los temas de Archivos, Clasificación (ordenamientos) y
Búsquedas, así como de clasificación (ordenamientos) codificados en el
lenguaje de programación C y un pequeño análisis comparativo entre estos
métodos. Además, se presenta un anexo donde se muestra un método de
clasificación (Mezcla) que aunque no lo contempla el temario es de mucha
utilidad.
Este apunte es el resultado del trabajo conjunto del autor, que ha impartido
esta materia en varios semestres, y de los alumnos, que han cursado esta
asignatura. El mejoramiento de esta obra podrá lograrse con la colaboración
nuevamente de los alumnos y profesores que la utilicen.
2
Muy pocas actividades, por no decir ninguna, se ha sustraído a la influencia de
la computadora, prueba de ello es que si por alguna causa repentinamente esta
desapareciera, buena parte de las actividades humanas, como la industria, el
comercio, el transporte, la medicina, la banca, las telecomunicaciones,
quedarían hundidas en un caos total, tal como sucedió hace algunos años,
cuando uno de los satélites de telecomunicaciones del país falló, se
paralizaron algunos servicios bancarios y, sobre todo, las comunicaciones de
los teléfonos celulares de algunas compañías.
Cada vez con más frecuencia nuestra economía y vida cotidiana está
irrevocablemente más ligada a las computadoras y ellas a los seres humanos.
Las computadoras son una creación de la humanidad, sin embargo, no
piensan, por lo que no cometen errores, solo ejecutan las operaciones que se
les indican a través de las instrucciones sobre qué y cómo hacerlo (son los
lenguajes de programación), no teniendo más datos que los que se les ha dado
o almacenado en su memoria, por lo tanto, no pueden producir un juicio o
criterio de selección (salvo, los esfuerzos para simularlo a través de Inteligencia
Artificial, pero al fin de cuentas, siguen siendo operaciones e instrucciones
dadas por el desarrollador).
3
A continuación se desarrollan los contenidos de cada uno de los tres capítulos
que componen este material.
4
TEMA 1. TIPOS DE ARCHIVOS DE ACUERDO A SU ORGANIZACIÓN Y
OPERACIONES SOBRE ESTOS
Objetivo particular.
Al finalizar este capítulo el alumno:
Identificará lo que son los conceptos de archivo y el Sistema de Archivos,
también conocerá y comprenderá sus organizaciones básicas y las
operaciones más comunes que se pueden hacer sobre ellos.
Temario detallado
1.1. Presentación de datos
1.1.1. Estructura Jerárquica
1.1.1.1. Campos
1.1.1.2. Registros
1.1.1.3. Archivos
1.1.1.4. Base de Datos
1.2. Terminología
1.2.1. Clave
1.2.2. Registro Físico y Bloque
1.2.3. Factor de Bloqueo
1.2.4. Tipos de Datos, Estructuras de Datos y Tipos Abstractos de
Datos
1.3. Organización de archivos
1.3.1. Secuenciales
1.3.2. Directos
1.3.3. Secuencial-Indexada
1.4. Operaciones sobre archivos
1.4.1. Creación, consulta y actualización
1.4.2. Clasificación, Reorganización
1.4.3. Destrucción
1.4.4. Fusión
1.4.5. Rotura/Estallido
5
1.5. Mantenimiento de archivos
1.6. Algoritmos para manipular archivos secuenciales
1.7. Algoritmos para manipular archivos indexados
1.8. Tratamientos de colisiones
1.9. Acceso a archivos directos mediante indexación
Introducción
El almacenamiento de datos en variables y arreglos se realiza en memoria
principal, eso quiere decir que son volátiles por la naturaleza misma de este
tipo de memoria y, cuando se termina de ejecutar el programa, todos esos
datos se pierden. Para la conservación permanente de datos se utilizan los
archivos, los cuales hacen uso de la memoria secundaria.
Datos e información
Desde la prehistoria, la humanidad ha tenido la necesidad de generar y usar
datos ya sea para registrar hechos, para el comercio o para el avance de las
ciencias. Ahora, en la época moderna, con el auge de las computadoras se ha
6
intensificado aún más el uso de los datos, ya que lo que una computadora
hace es, precisamente, manipular y manejar estos datos que son
proporcionados a través de los dispositivos de entrada y, una vez que son
tratados de acuerdo a los algoritmos de los programas, son transformados en
información y desplegados por medio de los dispositivos de salida o
almacenados en memoria secundaria.
7
entre los dos niveles (físico y lógico) y, dependiendo de su complejidad,
permitirá tener diferentes tipos de organizaciones de archivos, que más
adelante se verán.
Administración de datos
Para que un Sistema de Información sea útil, es necesario que éste funcione
bien, pero sobre todo que los datos con los que se esté alimentando sean
confiables y correctos, ya que por muy bien que funcione el sistema de
información, si los datos con que se alimenta son incorrectos, nos dará una
información errónea, por lo que se recomienda tener sumo cuidado en las
siguientes etapas de su administración:
- Captura. - Almacenamiento.
- Validación. - Recuperación.
- Clasificación. - Protección.
8
Permitir compartir estos datos por varios programas o aplicaciones.
Tener un mayor grado de confianza en el contenido de estos
archivos, ya que si una aplicación modifica alguno de los datos, este
se realiza y se ve reflejado cuando alguna otra aplicación, la
consulte.
9
1.1.1. Estructura Jerárquica
Los conceptos de carácter, campo, registro, archivo y base de datos son
conceptos referentes a la organización lógica (forma en que el usuario de una
computadora digital manipula o ve a los datos), las Estructuras de Datos, se
pueden organizar de forma jerárquica, como si se tratara de un árbol, donde el
nivel de mayor jerarquía es la Base de Datos y el de menor es el carácter.
BASES DE DATOS
10
1.1.1.1. Campos
Los datos son representados por números, letras y caracteres especiales y son
identificados por un ente (entidad) llamado campo, el cual es un grupo de
caracteres, por ejemplo el nombre del alumno, su número de cuenta, clave de
carrera, etc.
Los campos que conforman un registro pueden ser de diferente tipo y longitud.
Por ejemplo, Nombre del alumno (longitud de 30 caracteres alfanuméricos),
número de cuenta (longitud de 8 caracteres numéricos).
1.1.1.2. Registros
Un conjunto finito de campos, que pueden ser de diferente tipo y tienen una
relación lógica conforman un registro, el cual es utilizado como una unidad. Un
ejemplo sería, el registro de un alumno, que es conformado por campos como
los siguientes:
Número de cuenta, Nombre, Clave de la carrera, Clave de la Facultad, etc.
Al igual que los campos, también pueden ser de longitud fija y de longitud
variable, siendo esta última la menos común.
11
Por ejemplo retomando el caso de los libros para la Biblioteca, si además de
los títulos de los libros se capturarán los títulos de los capítulos, entonces no
tan solo se tendrían campos de longitud variable, si no que también números
de campos variables, ya que los libros no tienen un número fijo de capítulos.
1.1.1.3. Archivos
Como se mencionó anteriormente, un archivo es un conjunto de uno o varios
registros semejantes, los cuales pueden ser de longitud fija o variable, y, a su
vez, cada registro es un conjunto de uno o varios campos relacionados que
contienen a los datos elementales, los cuales también pueden ser de longitud
fija o variable, e incluso, el número de campos puede ser fijo o variable. Estos
registros se conservan en dispositivos de computadora de almacenamiento
secundario como pueden ser discos, cintas magnéticas y, más recientemente,
memorias USB.
1
Apuntes de Informática III, p.111.
12
Según la enciclopedia virtual Wikipedia,
“una base o banco de datos es un conjunto de datos que pertenecen al mismo
contexto almacenados sistemáticamente para su posterior uso. En este
sentido, una biblioteca puede considerarse una base de datos compuesta en su
mayoría por documentos y textos impresos en papel e indexados para su
consulta”2 .
Otra definición que tal vez sea la más general, menciona que:
Una Base de Datos es una colección de información que se almacena por un
periodo largo de tiempo, que puede llegar a ser de años (sobre todo ahora está
en auge la Minería de Datos, que se basa en parte en este principio, de tener
información por periodos largos de tiempo, para poder tener mas elementos en
la toma de decisiones) y que es manejado por un Sistema de Administración de
Base de Datos conocido como Data Base Management System (DBMS) o
simplemente sistema de bases de datos.
2
http://es.wikipedia.org/wiki/Base_de_datos
3
http://www.monografias.com/trabajos11/basda/basda.shtml
13
actualidad se conoce como Minería de Datos, en la cual se trata de
adelantarse a las necesidades de información de los usuarios, con el análisis
de grandes volúmenes de información, que puedan ser fácilmente consultados.
- Almacenar los datos por grandes periodos de tiempo, implantando medidas
de seguridad contra accidentes o permitiendo el acceso sólo a usuarios o
aplicaciones autorizadas.
- Controlar el acceso simultáneo por varias aplicaciones, sin que las acciones
que realice alguna de ellas afecten a las demás.
En general, los componentes de una Base de Datos son los tres que se
presentan a continuación:
Usuario o programa de aplicación. Los usuarios interactúan con el sistema
administrador de la Base de Datos, ya sea en forma directa a través del
lenguaje estructurado de consultas SQL, o a través de programas de aplicación
escritos en algún lenguaje de tercera o cuarta generación, que ya está pasando
a desuso.
Sistema de administración de Base de Datos. Es la interfaz entre los
programas de aplicación o los usuarios y los datos que ellos procesan, que
fueron descritas sus características en el apartado 1.1.
Base de Datos. Es la colección de datos altamente estructurados, que son una
especie de tablas o matrices, donde aparecen renglones que son los registros y
las columnas son los campos.
14
El relacional, en el cual las tablas de los registros se relacionan unas con otras
a través de campos comunes, siendo este modelo el que ha evolucionado y
prevalecido más que los otros y en la actualidad es el más popular y usado.
1.2. Terminología
1.2.1. Clave
Generalmente, existe un campo dentro del registro al que se le denomina
campo clave o llave, el cual es un campo de identificación único del registro,
esto quiere decir que su contenido no se repite, por ejemplo, el número de
cuenta de un alumno que aparece en todos los registros. Sin embargo, pueden
existir archivos que no contengan esta llave, como sería el caso de archivos
bibliográficos, donde se capturarán los títulos y autores de cada capítulo o de
todo el libro, pudiendo inclusive repetirse algunos de ellos.
Estos dos conceptos son equivalentes.
15
mayor tamaño del factor + de bloqueo, se realizan menos operaciones de
entradas y salidas al disco, pero también implica que el tamaño de la memoria
principal se vea reducido al darle mayor espacio a este factor de bloqueo.
Tipos de Datos
Se puede definir un tipo de dato a partir de los valores permitidos que puede
tomar éste y las operaciones que se puedan llevar a cabo sobre estos valores.
4
“Se dice que un lenguaje dispone de tipado fuerte si es posible determinar en
tiempo de compilación si las operaciones que se realizan sobre los datos son
consistentes con el tipo de los mismos.
Fortran, Cobol o C no disponen de tipado fuerte, mientras que Ada, Java o C++
sí están fuertemente tipados”. 5
4
Se refiere a los diferentes tipos de datos que se pueden manejar en un lenguaje de
programación, tales como los descritos en el apartado 1.1. Algunos lenguajes manejan una
mayor cantidad de tipos de datos.
5
http://www.dte.upct.es/personal/balvarez/Docencia/Fundamentos/Tema_2.pdf
16
El número de tipos primitivos que maneja.
Ver si permite mezclar los tipos de datos primitivos para crear otros tipos de
datos más complejos como son las estructuras.
Contemplar si pueden realizarse conversiones de tipos de forma segura
(casting) como el cambiar de tipo entero a carácter, en el caso de imprimir
gráficas.
Un ejemplo claro de este tipo de datos, son los diferentes tipos de listas, como
bien podrían ser las Pilas6 , en la que interesa más el hacer el PUSH (Agregar
un elemento) y el POP (retirar un elemento), que en ver como lo hace.
6
Las listas como Pilas, Colas, Colas Circulares y Colas Dobles, se tratan más a detalle en la
asignatura de Informática II y son Estructuras de Datos Compuestas.
Siendo las Pilas las que manejan la políticas de Últimas Entradas, Primeras Salidas.
17
anteriormente, como ejemplo tenemos el caso del lenguaje de programación C,
que se tienen en las librerías TDA, al ser lecturas y escrituras, o funciones
trigonométricas y el manejo de caracteres, en lugar de estar repitiendo código
de programación, mejor se deja uno sólo que puede ser utilizado por el
programa de aplicación que lo desee.
Clasificación de archivos
Existen diferentes formas para clasificar archivos de acuerdo a los siguientes
criterios:
18
1.3.1. Secuenciales
Son aquellos en que los registros están escritos, uno a continuación de otro y
para poder acceder a un registro n, es necesario haber recorrido los n-1
registros anteriores, por poner una analogía, se pueden comparar con un
cassette de música, en donde si se quiere escuchar la canción número cinco,
va a ser necesario haber escuchado las cuatro melodías anteriores (o hacer el
corrimiento de la cinta del cassette hasta llegar a la canción cinco).
19
Este tipo de archivos, es muy común aunque en el pasado lo era más, ya que
por mucho tiempo se ocupaban principalmente procesos en lote, sobre todo
porque era muy difundido el uso de las tarjetas perforadas, las cuales son el
caso típico de un archivo secuencial.
Otro ejemplo donde se utilizan archivos secuenciales es en las cintas
magnéticas que cada vez van siendo menos usadas, pero también se pueden
utilizar este tipo de archivos en disco.
20
INICIO DE ARCHIVO REGISTRO 1
REGISTRO 2
REGISTRO N - 1
REGISTRO N
FIN DE ARCHIVO
El orden físico en el que se fue grabando cada uno de los registros de este tipo
de archivos, pueden o no corresponder al orden lógico con que son tratados.
En la figura 1.3. se ejemplifica esta idea:
21
INICIO DE ARCHIVO M
N
FIN DE ARCHIVO
22
Son muy rápidos en cuanto al acceso de la información que contienen ya que
no se tienen que recorrer todos los registros que estén antes de él, se va
directamente a la posición n del registro buscado.
Esto se logra con el uso de una relación, que tiene como entradas los valores
de una llave y da una dirección como salida (también se conoce como
direccionamiento). Es importante recalcar que la relación que se utilice para
almacenar, sea la misma que se ocupe para recuperar los valores de las llaves.
Para poder hacer esto existen las varias alternativas, entre las más comunes
se encuentran las siguientes:
1) Mapeo directo.
2) Directorio.
3) Cálculo.
1) Mapeo Directo
Consiste en la conversión entre la dirección, que maneja el usuario y en la
que se deja físicamente el registro dentro del archivo.
Direccionamiento absoluto
Este método es uno de los más rápidos ya que se utiliza el valor de la llave
como la dirección física, por lo que no se necesita tiempo de procesamiento en
el cálculo de la dirección para localizar la posición del registro, ya que indica en
que dirección física se va a localizar
A pesar de ser muy rápido este método, también tiene sus desventajas, entre
las que se encuentran:
23
La gran dependencia del dispositivo de almacenamiento y del espacio a utilizar,
por lo que si se desea emigrar a otro equipo de cómputo con dispositivos de
almacenamiento diferentes, implicará que las direcciones físicas también
cambien. Puesto que los dispositivos de almacenamiento para este tipo de
organización son los discos y para localizar físicamente un registro se requiere
del número de la pista, del sector y de la superficie.
Es que la llave a veces no se podría hacer que coincida con posiciones reales,
por ejemplo si se trata de campos no numéricos como el Registro Federal de
Contribuyentes o a pesar de ser numéricos, maneje rangos grandes como un
número de cuenta de una tarjeta bancaria de dieciséis dígitos, lo cual haría de
gran tamaño el archivo en cuanto a número de registros y quizás no todos se
llegaran a ocupar.
Direccionamiento relativo
En este tipo de direccionamiento, la dirección de un registro en el archivo es el
número del registro.
24
ésta. Por ejemplo, si se tienen los números de cuenta de los alumnos de una
escuela, los cuales constan de cinco dígitos, y cada año al inscribirse, los dos
primeros dígitos, indican el año de ingreso entonces, sólo quedarían tres, con
los cuales se puede manejar un rango de mil combinaciones (del 000 al 999).
Por lo que el tamaño del archivo sería de mil elementos y no del valor más
grande de la llave, que sería 99999.
2) Directorio
En este tipo de direccionamiento, se utiliza una tabla llamada directorio o
diccionario (espacio adicional), el cual va a tener el valor de la llave y la
dirección relativa como se muestra en la siguiente figura:
A 7 E
C 4 N
E 1 I
G 6 C
I 3 K
K 5 G
N 2 A
25
Figura 1.4. Directorio
Otra forma mejorada para evitar los corrimientos que se tendrían que hacer en
los elementos de la tabla que está organizada en forma contigua es cambiarla
por una organización simplemente ligada, ahorrando tiempo de procesamiento,
pero aumentando el espacio de memoria utilizado, ya que involucraría más por
las ligas.
En este método de Directorio, lo que hay que optimizar son los dos factores
que se han estado mencionando:
Espacio adicional de memoria.
Tiempo de procesamiento.
En el tema 2, se verá más a detalle alguno de los criterios que se siguen para
medir la eficiencia de los algoritmos.
26
3) Cálculo
Este tipo de direccionamiento se da a través de la manipulación del campo
llave a través de la programación entre el contenido de dicha llave y la posición
que ocupa dentro del archivo. Esto se hace a través de la utilización de las
funciones de Mapeo también conocidas como funciones de Hash.
Las funciones de Hash serán tratadas un poco más a detalle en el tercer tema
de estos apuntes.
27
Una correspondencia entre los valores de la llave y las direcciones disponibles
del dispositivo de memoria secundaria.
LLAVE POSICIÓN
28
INICIO DE ARCHIVO B REGISTRO 1
M REGISTRO 2
A REGISTRO 3
L REGISTRO N - 1
X REGISTRO N
FIN DE ARCHIVO
1.3.3. Secuencial-Indexada
Esta organización está diseñada para utilizar la combinación de la organización
directa y de la secuencial.
29
A través de esta organización es posible el acceso a un registro en particular
(aleatoria) por medio de la llave (la cual es sólo una, la primaria) y también a la
organización secuencial, ya sea desde el inicio o desde cualquier otro registro
del archivo.
Para poder realizar este tipo de organización, es necesario contar con tres
áreas:
De índices.
Primaria o de datos.
De excedentes o de desbordamiento o de overflow.
El área primaria tendrá los registros de datos, los cuales estarán clasificados
en forma ascendente de acuerdo a su campo llave.
30
El área de excedentes, sirve para agregar nuevos registros que ya no son
colocados en el área primaria al actualizar el archivo
31
apuntador a nulo (NULL), esto es, que ya no apunta a ninguna
dirección, entonces renueva el acceso donde se abandonó en el
archivo principal.
Ventajas Desventajas
32
Desperdicio de espacio dentro
del archivo, ya que quedan
Rápido acceso
huecos libres, al ser actualizado
el archivo
El Sistema de archivos, es el que
se encarga de relacionar la Se requiere de más espacio,
posición de cada registro con su para el área de índices y de
contenido a través de su tabla de excedentes
índices
1 ac 4 da 6 mm
aa ….. ab …… ac ….. bc …… da …… fa …… mm ……
ba …… zm ……
33
dirección es el registro 3, en tanto que el siguiente segmento empieza en la
dirección 4 y su llave más alta es da y el tercer segmento empieza en la
dirección 6 y su llave más alta es mm y así sucesivamente.
En este tipo de organización se pueden dar las operaciones de lectura y de
escritura, una u otra o las dos simultáneamente.
Creación
Al igual que un ser vivo los archivos, tienen un inicio una vida útil y un fin, la
creación es la primera operación que se tiene, ya que para poderlo utilizar es
necesario que exista.
- Organización
34
- Dispositivo al que se direcciona (impresora, disco, Monitor por ejemplo)
- Tamaño del registro lógico (MAXRECSIZE)
- Tamaño del registro físico (BLOCKSIZE)
- Número de áreas (AREAS)
- Tamaño del área (AREASIZE)
Nótese que existen una gran cantidad de atributos de archivos y los nombres
que aparecen entre paréntesis pueden llagar a cambiar, así como algunos
atributos, dependiendo del sistema de archivos, que se esté utilizando.
Ejemplo
Se tiene un archivo con las siguientes características:
Puede llegar a tener 10,000 registros lógicos.
MAXRECSIZE de 20, ya que cada registro lógico tiene una longitud de 20
caracteres (bytes).
Un BLOCKSIZE de 100 caracteres, que es el tamaño del registro físico.
Y AREASIZE de 20 registros lógicos.
Se desea encontrar:
- El Factor de Bloqueo (FB).
- El número de áreas que se necesitan, para almacenar los 10,000 registros
físicos.
Solución:
El Factor de Bloqueo indica, cuántos registros lógicos hay en un registro físico.
De los datos anteriores, se tiene que el registro físico es de 100 caracteres y el
registro lógico es de 20 caracteres, entonces el Factor de Bloqueo es:
FB = BLOCKSIZE/MAXRECSIZE
FB = 100 / 20
FB = 5 registros lógicos en un registro físico.
35
Si el tamaño de cada área es de 20 registros lógicos, entonces para almacenar
10,000 registros lógicos se necesita realizar la siguiente división para saber
cuántas áreas se van a ocupar:
Áreas = 10,000 / 20
Áreas = 500
El tamaño del área debe ser tal que contenga por lo menos un registro físico.
36
Un archivo secuencial, si se trata de datos, se puede crear de dos formas:
1. A través de un editor del equipo de computo, como podría ser Word, bloc de
notas o Vi, etc.
2. A través de un programa desarrollado en algún lenguaje de programación,
en el cual se puedan leer los datos a partir del teclado o de algún otro
dispositivo, para almacenarlos en un archivo.
Consulta
Es la operación que realiza el usuario para poder leer o acceder a los registros
del archivo y conocer su contenido.
PROCESO DE
CONSULTA
Actualización
37
La información es poder siempre y cuando ésta sea confiable y se encuentre
actualizada, esto es, que la información se encuentre al día en cuanto a las
modificaciones que va sufriendo el archivo.
La actualización de un archivo es la operación que permite precisamente tener
al día los registros de un archivo, para lograr esto se requiere realizar las
siguientes operaciones en sus registros, que se conocen comúnmente como el
ABC.
Altas.
Bajas.
Cambios.
Las altas son las acciones de ingresar nuevos registros a los archivos, las
bajas se dan cuando es necesario desechar algunos registros y los cambios
cuando se requiere de la modificación de algunos de los datos o campos de un
registro.
Clasificación
La información se tiene para poderla utilizar y para ello se requiere consultar
siendo mas fácil y rápido esta acción, si ésta se encuentra clasificada
(ordenada), por alguno(s) de los campo(s) que componen los registros,
38
pudiendo ser en forma ascendente (de menor a mayor) o descenderte (de
mayor a menor).
Reorganización
Esta operación de reorganización consiste en modificar la organización de los
archivos, ya que con el paso del tiempo, se puede dar el caso de que se
detecten algunos casos que no se contemplaron o que los requerimientos
iniciales se modificaron y que se hace necesario cambiar, la organización del
archivo, por ejemplo si solo se habían contemplado las actualizaciones en “lote”
(batch) y se requieren ahora actualizaciones en “línea” y originalmente se tenia
un archivo con una organización Secuencial, ahora se necesita que se Directo
o Secuencial-Indexado. Para lo cual va a ser necesario realizar una copia del
archivo original, para obtener el nuevo ya reorganizado. Solo se refiere al
cambio de organización del archivo.
1.4.3. Destrucción
Haciendo la analogía con un ser vivo, un archivo es un ente que se crea, tiene
un periodo de vida útil y muere, este último sería la destrucción, que es
cuando se anula o se borra un archivo, después de esto ya no se puede
acceder a ninguno de sus registros.
1.4.4. Fusión
Es la operación que permite juntar varios archivos en uno solo, intercalándose
entre ellos, siguiendo algún criterio predeterminado, poniendo por ejemplo el
caso de una Universidad, donde cada Facultad pueden tener un archivo propio
de alumnos inscritos y se requiere, por parte de Rectoría, tener estadísticas
globales de toda esa Universidad, en ese caso conviene fusionar en un solo
archivo a los alumnos inscritos para obtener esas estadísticas.
39
FUSIÓN
ROTURA/ESTALLIDO
40
Se refiere a los cambios que se llevan a cabo en un archivo con el fin de
mejorar la ejecución de los programas que lo accedan, este mantenimiento se
da por medio de las dos siguientes operaciones:
Reestructuración.
Reorganización.
A D F
A B C E FF
41
Figura 1.11. Proceso de reorganización
Para poder utilizar los archivos, los programas tienen que realizar algunas de
las siguientes operaciones:
42
Reescritura (rewrite). Consiste en reescribir en la misma posición el mismo
registro, tal vez modificado en algún o algunos de sus campos. No todos los
tipos de organización lo permiten.
Es importante recordar que este tipo de archivos ocupan menos memoria, son
muy empleados para el almacenamiento de información, donde los contenidos
sufren pocas modificaciones en el transcurso de su vida útil y para procesos de
actualización “en lote”.
43
Creación
Es un proceso secuencial, en el que los registros se van almacenado en el
orden en que van llegando al archivo. El algoritmo es muy sencillo, sólo se
requiere de un algoritmo implantado en un programa, donde se leerán los datos
de cada registro y posteriormente se grabarán en un archivo.
Puede darse el caso de que se cree el archivo nuevo, desde el primer registro,
o ir agregando registros a continuación del último registro a un archivo que ya
exista.
Estos atributos son los que se van a utilizar en los algoritmos que a
continuación se presentan en pseudocódigo.
Algoritmo de Creación
inicio
desplegar “ 1.- Creación de un archivo nuevo”
44
desplegar “ 2.- Añadir datos al archivo”
leer opción
si opción es igual a 1 entonces
abrir el archivo para crearlo nuevo
en caso contrario
abrir el archivo para añadir datos
fin
mientras no sea fin de archivo hacer
leer los datos de un registro
escribir esos datos en el archivo
fin
cerrar el archivo
fin
Consulta
Esta operación va muy relacionada con lo que son las búsquedas, las cuales
pueden ser por comparación o por transformación de llaves.
45
Es importante resaltar que la búsqueda o consulta se puede realizar por uno o
varios campos que conforman el registro del archivo.
Las consultas por comparación de llaves pueden ser muy rápidas si el registro
se encuentra en las primeras posiciones del archivo o, por el contrario, muy
lentas si se encuentra en las últimas posiciones y si además el archivo es muy
grande (cientos de registros). El peor de los casos es cuando no se encuentra
el registro dentro del archivo, sin embargo, para percatarse de ello es necesario
recorrerlo todo, consumiendo tiempo en la búsqueda.
46
mientras no se encuentre el fin de archivo (EOF)
si registro (campo x) = registro (campo leído) entonces
desplegar “búsqueda con éxito ya que el registro buscado
existe”
cerrar el archivo
alto
fin
leer registro del archivo
fin
desplegar “búsqueda sin éxito, no existe el registro”
cerrar el archivo
fin
Altas
Una alta es la creación de un nuevo registro en el archivo, el cual se trató en la
operación de creación. En el caso particular de un archivo Secuencial, la
operación de alta, es la creación de un nuevo archivo, ya que este tipo de
organización, no admite la incorporación de nuevos registros intermedios, sólo
después del último.
Algoritmo de altas
inicio
abrir archivo para añadir
leer un registro
mientras no se encuentre el fin de archivo (EOF)
47
escribir registro en el archivo
leer un registro
fin
cerrar el archivo
fin
Bajas
Es la supresión de un registro del archivo, pero con este tipo de organización
no se puede dar la baja directamente, por lo que será necesario realizarla con
la utilización de un archivo auxiliar, el cual también es secuencial.
Algoritmo de bajas
inicio
abrir archivo_ auxiliar para crearlo nuevo
abrir archivo_ original para lectura
leer un registro_ original
mientras no se encuentre el fin de archivo (EOF)
si registro_ original (campo_ tipo_ mov “baja”) entonces
escribir registro_ original en el archivo_ auxiliar
fin
leer registro_ original
fin
cerrar el archivo_ auxiliar
cerrar el archivo_ original
fin
48
BAJAS DE
REGISTROSS
Cambios
Este proceso consiste en la localización de un registro para realizar algún
cambio en uno o varios de los campos y, posteriormente, volver a reescribir
(rewrite) el nuevo registro en el archivo.
Algoritmo de Modificación
inicio
abrir archivo_ auxiliar para crearlo nuevo
abrir archivo_ original para lectura
leer un registro_ original
49
mientras no se encuentre el fin de archivo (EOF)
escribir “Modificar S/N”
leer la respuesta
si respuesta = ‘S’ entonces
realizar la modificación del o de los campo(s)
fin
escribir registro_modificado en el archivo_auxiliar
fin
cerrar el archivo_auxiliar
cerrar el archivo_original
borrar archivo original
cambiar el nombre del archivo auxiliar por el del original
fin
50
Un archivo Indexado, es un conjunto de n registros, donde cada uno de ellos
cuenta con una llave que identifica de manera única a cada registro y una
información que se asocia a esta llave. Por ejemplo, se tiene el número de
cuenta de un alumno, es la llave y la información asociada a ella puede ser el
nombre del alumno, número de créditos, clave de la carrera, etc.
Para acceder los registros en forma aleatoria, tanto para lectura como para
escritura, se hace necesaria la creación de un índice, para su recuperación.
El índice es una entidad que tiene como entrada la llave primaria cuya salida es
una información que permite la rápida localización física del registro. Los
índices son almacenados en un archivo de índices, con el fin de optimizar las
búsquedas.
51
Figura 1.14. Árbol de búsqueda.
52
Utilización de árboles B+: en esta otra forma, los datos (o llaves) sólo se van
a encontrar en los nodos hojas (también conocidos como nodos terminales) y
los nodos, que son la raíz y los intermedios, van a servir para acceder a los
nodos terminales, esta técnica se muestra en la siguiente figura:
a h w
a c d h j k l w z
Los nodos índices y los nodos hojas pueden llegar a tener diferentes formatos
y/o tamaños. Los nodos hoja son ligados de izquierda a derecha, es en estos
nodos donde se encuentra la llave, la lista de nodos hojas se procesa
secuencialmente y la búsqueda se realiza de la raíz del árbol a través del
índice, hasta la hoja que lo encuentre.
53
1
1
1
1
1
1
1
1
2
2 1
3 2 1
3 2 1
1 1
4
7 1
3
9 1
2
4
2
4
6
4
Estas direcciones idealmente deben ser únicas para cada valor de llave e
irrepetibles. Por esto, también se conocen como funciones de mapeo de uno
a uno (un valor de llave para una dirección única dentro del archivo).
El problema es que no siempre se puede dar esta relación de uno a uno, pero
no hay de qué preocuparse, tiene solución.
54
Cuando se tiene más de una llave diferente y se transforman a través de la
función de dispersión y de la misma dirección para almacenar estos registros
se conoce como colisión. Ya que sólo se puede almacenar un registro en cada
dirección.
Creación
Es muy parecida a las organizaciones Secuenciales y Directas, el proceso de
creación es la acción de ir introduciendo los registros nuevos en el dispositivo,
que los va a almacenar y en la dirección previamente obtenida, después de
ocupar el algoritmo o función de Hash (que tiene como entrada la llave del
registro y da como salida la dirección, donde se va a almacenar o recuperar
dicho registro).
Si la dirección de ese registro ya está previamente ocupada por otro registro,
puede resolverse de diferentes maneras, de acuerdo al esquema que se utilice
(por ejemplo Mapeo por Direccionamiento absoluto o Mapeo o por
Direccionamiento relativo, por Directorio o por cálculo) o bien si se maneja un
espacio de excedentes, el nuevo registro quedará ahí.
Algoritmo de creación
55
inicio
abrir el archivo para escribir
leer un registro
mientras no sea fin de archivo (o de introducción de datos) hacer
calcular la dirección, mediante algoritmo de conversión
verificar si la dirección esta libre
¿si esta libre la dirección?
se graba el registro
en caso contrario
buscar una dirección en el área de excedentes
grabar el registro
fin
leer un registro
fin
fin
Algoritmo de altas
Para este algoritmo, se necesita introducir el contenido y la posición en la cual
se desea grabar el registro NR (Número del Registro o posición donde se
desea grabar)
inicio
abrir el archivo para escritura
repetir
leer ‘número de la posición, donde se desea dar de alta el registro’ NR
si (NR 0) OR (NR LimiteDeRegistrosDelArch) entonces
leer registro NR
Si Bandera = 1 entonces
escribir ‘registro ya existe y no se graba’
en caso contrario
Bandera =1
leer datos del registro
escribir Bandera y datos en registro NR
56
fin
en caso contrario
escribir ‘error el NR (número de registro) fuera de rango del
arch.’
fin de si
hasta que no se deseen más altas
cerrar el archivo
fin
Algoritmo de bajas
Para realizar las bajas, no se borra físicamente el registro, lo que se hace es
marcar el registro en un campo, que para el siguiente algoritmo se usará como
bandera, que tendrá un valor de cero cuando no exista y valor de uno cuando
no exista lógicamente
inicio
abrir archivo para escribir
repetir
leer NR (número de registro)
si (NR 0) OR (NR LimiteDeRegistrosDelArch) entonces
leer registro NR
si Bandera = 0 entonces
escribir ‘el registro no existe, no se da de baja’
en caso contrario
Bandera = 0
Escribir el registro NR (ya modificada la
Bandera)
fin
en caso contrario
escribir ‘registro fuera del rango del archivo’
fin
hasta que no se deseen más bajas
57
cerrar el archivo
fin
Algoritmo de cambios
En este tipo de archivos, para realizar los cambios o modificaciones, primero se
lee el registro, posteriormente se modifica y finalmente se reescribe (rewrite).
inicio
abrir archivo para reescribir (de lectura y escritura)
repetir
leer NR (número de registro)
si (NR 0) OR (NR LimiteDeRegistrosDelArch) entonces
leer registro NR
leer los cambios de lo(s) campo(s)
realizar los cambios
reescribir el registro en el archivo con los cambios
en caso contrario
escribir ‘registro fuera del rango del archivo’
hasta que no se deseen más modificaciones
cerrar el archivo
fin
Resumiendo los conceptos vertidos en este primer tema, se puede decir, que
los archivos surgieron por la necesidad de poder almacenar por tiempo
prácticamente indefinido (no sólo mientras durase la ejecución del programa
que lo generase) y para tener una mayor capacidad de almacenamiento de
datos y de información, estos requerimientos, siguen estando presentes en lo
que a desarrollo de sistemas de información se refiere.
58
Han aparecido también nuevas Tecnologías de la Información (TI), como los
son los manejadores de Bases de Datos que en un principio se pensaba que
llegarían a desplazar el uso de los archivos, sin embargo, estos Manejadores
se auxilian del Sistema de Archivos y es evidente que los Manejadores de
Bases de Datos tienen un costo extra, ya que hay que comprar un software
adicional, en cambio, utilizar el Sistema de Archivos no tiene costos
adicionales, basta con tener el sistema operativo.
Cualquier aplicación de sistemas de información se puede realizar si se cuenta
con un Sistema Operativo y un Compilador (o en su caso Intérprete) de algún
lenguaje de programación, siendo a través de él que se pueden manipular los
archivos. Se invierte más tiempo y esfuerzo en desarrollar las aplicaciones con
sólo la utilización del Sistema de Archivos a que si fuera con un Manejador de
Base de Datos, pero se pueden llevar a buen término.
59
ROSE Gómez, César E., Archivos, organización y procedimientos, México,
Computec, 1993, pp. 227.
VILLERS, Abelardo, Tecninotas. Introducción a Base de Datos, México, Centro
de Servicios de Cómputo CSC UNAM, Septiembre de 1981, pp. 11.
Actividades de aprendizaje
A.1.1. Elabora un mapa conceptual de este tema.
A.1.2. Investiga Bibliografía actual, diferente a la mencionada en este capítulo,
indicando la Ficha Bibliográfica como se mostró anteriormente y si es posible,
la clasificación hecha por la biblioteca y en cuál de ellas, se localizó, así como
los conceptos o palabras claves que creas más conveniente incluir por su
relevancia, con los temas de la materia, para su posterior consulta.
A.1.3. Realiza un programa en el lenguaje de programación C para
implementar uno de los algoritmos que permita manipular archivos
secuenciales, a partir del pseudocódigo visto en esa sección.
A.1.4. Elabora un programa en el lenguaje de programación C para
implementar uno de los algoritmos que permita manejar archivos directos,
tomando como base el pseudocódigo visto en este tema.
A.1.5. Investiga por lo menos una aplicación donde se ocupen archivos
secuenciales.
1. ¿Qué es un archivo?
2. ¿Qué es el Factor de Bloqueo (FB)?
3. ¿Qué es un tipo de datos?
4. De acuerdo a su forma de acceso ¿Cómo se clasifican los archivos?
5. ¿Cuáles son las dos operaciones en el mantenimiento de archivos?
6. ¿Cómo se define la organización de los archivos?
7. Menciona a qué se enfocan los tipos de datos abstractos.
8. ¿Cuál es la diferencia entre el Direccionamiento absoluto y el
Direccionamiento relativo en la organización Directa de archivos?
60
9. ¿Qué campos de información contiene el directorio o diccionario en los
Archivos Directos?
10. ¿De qué depende la ejecución de una función hash?
Examen de autoevaluación
61
( ) 10. Una colisión se da j. La relación del tamaño del
cuando: registro físico entre el tamaño
del registro lógico.
62
5. Un campo es:
a) un grupo de caracteres.
b) una serie de áreas.
c) un conjunto de registros.
d) una colección de factores de bloqueo.
63
TEMA 2. MÉTODOS DE CLASIFICACIÓN Y CONSIDERACIONES DE
COMPLEJIDAD
Objetivo particular.
Al término de este capítulo el alumno será capaz de:
Identificar lo que es el proceso de clasificación, también conocerá y aplicará
los métodos internos y externos de clasificación (ordenamientos), así como
algunos criterios, para seleccionar uno de ellos.
Temario detallado
2.1. Ordenamiento por intercambio (Bubblesort)
2.2. Ordenamiento por inserción directa
2.3. Ordenamiento por selección
2.4. Método Shell
2.5. Ordenación rápida (Quick Sort)
2.6. Criterios de selección del método de ordenamiento
2.7. Análisis comparativo de las complejidades de los distintos métodos de
ordenamiento
Introducción
La importancia de contar con información oportuna y a un costo accesible,
radica en poder ayudar en la toma de decisiones dentro de una empresa, para
lo cual es necesario transformar, a través de procesos, los datos (provenientes
de diversos eventos) en información, para lo cual juega un papel muy
importante el tener la información clasificada.
Algunos ejemplos donde la clasificación de la información es de vital
importancia son los que a continuación se mencionan:
- En el uso de cualquier diccionario escolar, donde sería casi imposible localizar
una palabra que no tuviera una clasificación alfabética.
- En la búsqueda de algún libro, revista o tesis en una biblioteca, ya que con la
gran cantidad de ejemplares que manejan, sin alguna clasificación, sería casi
imposible la localización del ejemplar que se estuviera buscando.
64
- En la generación de documentación como estados de cuenta bancarios, listas
de los alumnos inscritos, inventarios etc., donde resulta de gran ayuda, el tener
la información clasificada de acuerdo a alguna(s) llave(s).
- En la actualización de la información, a través de las de altas, bajas y
cambios, que se hacen sobre sus registros, las cuales se pueden realizar con
mayor eficiencia, si la información esta clasificada.
- En la mezcla de dos o más archivos secuenciales, en uno solo Fusión, la cual
fue comentada en el primer tema, se realiza más rápidamente si los archivos
también estuvieran previamente clasificados.
Clasificación (ordenamientos)
El proceso de clasificación “consiste en ordenar una secuencia de registros de
tal forma que los valores de sus claves formen una secuencia no decreciente.
Esto es, dados los registros r 1 ,r 2 , ... r n , con valores de clave k 1 ,k 2 , ... k n ,
registros tengan valores distintos, ni que los registros con claves iguales
aparezcan en un orden particular” 7.
7
Alfred V Aho, et al, Estructuras de Datos y algoritmos, p. 253.
65
seleccionen para tal fin. Para lograr esto, se han desarrollado una gran cantidad de
algoritmos”.8
8
Jorge Iván Ávila Euán y Luis Gonzaga Cordero Borboa, Estructuras de datos, p. 40.
9
Idem.
66
Interna
(solo ocupa memoria principal)
Clasificación Cascada
Polifase
Externa (ocupa memoria Distribución
principal y secundaria)
Directa
Repetitiva
Selección
Torneo
Heap
Burbuja
Doble burbuja o embudo
Intercambio Quick
Clasificación
Pares o Nones
interna
Directa
Inserción
Binaria
Shell
Distribución Distribución
Mezcla Mezcla
67
Figura 2.2. Tipos de clasificación interna.
Para poder optimizar el espacio de este trabajo, sólo se presentarán las partes
medulares de cada programa.
68
nombre aletorios.txt. El código del programa que genera este archivo se
muestra a continuación.
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main()
{
int k, a1[10];
time_t t;
FILE *ale;
ale=fopen("aleatorios.txt","w");
if(ale==NULL)
{
printf("****ERROR al abrir el archivo aleatorios.txt****");
exit(EXIT_SUCCESS);}
srand((unsigned) time(&t)); // Se generan los 50 numeros aleatorios
for (k=0;k<50;k++)
fprintf(ale,"%d \n",rand() % 100);
fclose(ale);
69
que (n-2) y así sucesivamente, hasta que se comparan los datos que se
encuentran en las posiciones uno y dos, siendo cuando termina la primera
pasada y es cuando se coloca un elemento en la primera posición, el cual es
marcado de alguna manera, para que en las siguientes pasadas, ya no se tome
en cuenta.
Una pasada, es el proceso que realiza el algoritmo, para poder colocar uno de los elementos
a clasificar en la posición que le corresponde, de acuerdo al criterio que se este siguiendo, ya
se en forma ascendente o descendente.
70
printf("\n\t**** METODO DE LA BURBUJA *****\n\n");
printf("\n\t*** los elementos desordenados son ***\n");
for (k=0;k < num; k++)
printf (" %d ",a[k]);
printf("\n\n");
principio = clock();
i=1;
aux=0;/*variable auxiliar para el intercambio de valores */
k=-1;
bandera=1; // bandera que se prende para terminar el ciclo
while (bandera)
{
k=k++; // k indica la posicion del elemento que se va colocando
bandera=0; //se hace falso para terminar el ciclo de clasifi.
for (j=num-1;j > k;j--)
{
delay(10);
if (a[j] < a[j-1])
{
bandera=1;
aux=a[j]; /* realiza el intercambio de elementos*/
a[j]=a[j-1];
a[j-1]=aux;
}
}
}
fin = clock();
num=num-1;
printf("\n\t*** los elementos ordenados en forma");
printf(" asecendente son ***\n");
for (k=0;k <= num; k++)
printf (" %d ",a[k]);
nele[1][z]=num+1;
ntiempo[1][z]=((fin - principio)) / CLK_TCK ;
printf("\n\n");
printf("\n\t*** El tiempo de ejecucion en decimas de segundos\n");
printf("\t\ten forma ascendente fue de: %7.5f ",((fin - principio))
/ CLK_TCK);
printf("****");
71
}
La salida es la siguiente:
**** METODO DE LA BURBUJA *****
*** los elementos desordenados son ***
62 39 62 77 77 86 74 55 82 86 3 88 44 40 9
*** los elementos ordenados en forma ascendente son ***
3 9 39 40 44 55 62 62 74 77 77 82 86 86 88
Pasadas a detalle
5 5 5 5 0 0 0
6 6 6 0 5 5 5
9 9 0 6 6 6 6
4 0 9 9 9 9 0
0 4 4 4 4 0 9
0 0 0 0 0 4 4
1ª pasada
0 0 0 0 0 0 0
5 0 0 0 0 0 0
0 5 5 5 4 4 4
72
6 6 6 4 5 5 5
9 9 4 6 6 6 6
4 4 9 9 9 9 9
2ª 3ª pasada 4ª 5ª
pasada pasada pasada
Figura 2.3. Clasificación por el método de burbuja
Los números que van quedando con color marrón, son los que se acomodan
en la posición que les corresponde.
73
En este conjunto, se irán insertando cada uno de los nuevos elementos y en su
caso se realizaran los corrimientos correspondientes de los demás elementos
del conjunto, para que siga quedando clasificado. A continuación se muestra en
pseudocódigo este método:
74
ese nuevo elemento se va recorriendo hacia la izquierda mientras encuentre
elementos mayores o iguales a el.
Ejemplo
A continuación, se muestra un ejemplo con datos de este método, con el
criterio de clasificación en forma ascendente:
8 4 2 5 2 1 9
4 8 2 5 2 1 9
4 2 8 5 2 1 9
2 4 8 5 2 1 9
2 4 5 8 2 1 9
2 4 5 2 8 1 9
2 4 2 5 8 1 9
2 2 4 5 8 1 9
2 2 4 5 1 8 9
2 2 4 1 5 8 9
2 2 1 4 5 8 9
2 1 2 4 5 8 9
1 2 2 4 5 8 9
1 2 2 4 5 8 9
75
Los números marcados con azul son los que se van agregando al conjunto de
elementos y se van acomodando, de acuerdo a su valor.
En este grupo los métodos más comunes son como se ve en la figura 2.1, son:
Selección Directa
Selección Repetitiva
Torneo
Heap
76
En cada pasada se coloca un elemento a excepción de la última, en la cual se
colocarán dos elementos, ya que al quedar sólo dos de ellos y escoger al más
chico y colocarlo, el otro automáticamente queda colocado en su lugar.
77
printf("\n\t*** los elementos ordenados en forma");
printf(" asecendente son ***\n");
for (k=0;k <= num; k++)
printf (" %d ",a50[k]);
nele[0][z]=num+1;
ntiempo[0][z]=((fin - principio)) / CLK_TCK ;
printf("\n\n");
printf("\n\t*** El tiempo de ejecucion en decimas de segundos\n");
printf("\t\ten forma ascendente fue de: %7.5f ",((fin - principio))
/ CLK_TCK);
printf("****");
getchar();
} // fin de sel_directa
Ejemplo
En la siguiente figura, se presenta un breve resumen de cómo funciona el
método:
78
4 -3 -3 -3 -3 -3
5 5 4 4 4 4
7 7 7 4 4 4
8 8 8 8 5 5
4 4 4 7 7 7
-3 4 5 5 8 8
1ª pasada 2ª pasada 3ª pasada 4ª pasada 5ª pasada
79
para que vuelva a competir y nuevamente saldrá un “ganador” de todos los
grupos y este ingresa a la segunda posición del arreglo donde se van
colocando los elementos, ya clasificados y así se sigue, hasta que todos los
elementos, ya han sido transportados al nuevo arreglo.
Para el tamaño de los nuevos grupos, se pueden tomar varios criterios como el
de la raíz cuadrada N , donde N, es el número de elementos que se desean
80
El Pseudocódigo del algoritmo es el siguiente:
inicio
indice= - 1
i= n
p = -1
k = -i
j=0
hacer mientras ( j < i )
p=p+1
k=k+i
m=k
c = k +1
hacer mientras ( c ( k + i – 1 ) )
si datos [c] < datos [m] entonces
m=c
fin
c=c+1
fin
j = j +1
ganadores [p][0] = datos [m]
ganadores [p][1] = m
fin
j=0
hacer mientras ( j < n )
m=0
c = m +1
hacer mientras ( c < i ) // se seleccionan el ganador de los
ganad.
si ganadores [c][0] < ganadores [m][0]
m=c
81
fin
c=c+1
fin
p = m // p dice de que grupo salio el ganador
indice = indice + 1
menor [indice] = ganadores [m][0] // es el ganador de todos
datos [ ganadores [m][1] ] = infinito
k= i * m
m=k
c= m +1
hacer mientras ( c ( k + i – 1 ) )
si datos [c] < datos [m]
m=c
fin
c=c+1
fin
ganadores[p][0]=datos[m]
ganadores [p] [1] = m
j=j+1
fin
fin
Ejemplo
82
A continuación se ejemplifica el método con un conjunto de elementos
suponiendo que están clasificados en orden ascendente:
8 1 9 4 5 2 8 5 -7
1 2 -7
-7
Primera pasada
8 1 9 4 5 2 8 5
1 2 5
-7 1
Segunda pasada
83
8 9 4 5 2 8 5
8 2 5
-7 1 2
Tercera pasada
8 9 4 5 8 5
8 4 5
-7 1 2 4
Cuarta pasada
84
8 9 5 8 5
8 5 5
-7 1 2 4 5
Quinta pasada
8 9 8 5
8 5
-7 1 2 4 5 5
Sexta pasada
85
8 9 8
8 8
-7 1 2 4 5 5 8
Séptima pasada
9 8
9 8
-7 1 2 4 5 5 8 8
Octava pasada
86
9
9
-7 1 2 4 5 5 8 8 9
Novena pasada
-7 1 2 4 5 5 8 8 9
87
elementos de los últimos grupos como marcados de que ya salieron con infinito
.
Por ejemplo, si se tienen 10 elementos, entonces 10 = 3.1622 y los grupos
serían de 4.
1 3 5 5 -5 3 7 5 4 6
1 -5 4
-5
88
una analogía con un campeonato de fútbol, se tienen octavos y cuartos de final,
semifinal y final, por ejemplo si se tiene:
3
n , el número de niveles es de 3 (la raíz del árbol y dos niveles más), que
indican; el nivel donde esta todos los datos, otro nivel de semifinal y un tercer
nivel de “ganadores”, de la gran final.
4
n , el número de niveles es de 4 (la raíz del árbol y tres niveles más), los
cuales tendrán en el primer nivel, todos los datos, en un segundo nivel los
números “ganadores” de cuartos de final, un tercer nivel los elementos
“ganadores” de la semifinal y cuarto nivel con los “ganadores de la gran final.
Para el resto de las raíces, quinta, sexta, etc., el árbol que se va ocupando va
ir creciendo.
89
1 3 5 7 9 8 1 7 9 1 9 9 2 4 7 4 3 6 8 7 9 9 3 3 2 8 0
1 7 1 1 2 3 7 3 0
1 1 0
Torneo
Definición del método
El método de torneo es una variante de selección repetitiva, que se da
cuando sólo dos elementos “compiten” entre sí, su nombre se debe a los
torneos medievales donde los “caballeros medievales”, competían de dos en
dos y el ganador era el que pasaba a siguiente etapa de eliminación por lo que
sólo llegaban la mitad de los caballeros y según se iban desarrollando cada
una de las etapas, al final queda únicamente uno de los caballeros como
ganador único.
En el caso de este método de clasificación los “caballeros medievales” son los
datos o llaves a clasificar.
Ejemplo
En el siguiente ejemplo, sólo se mostrará la pasada, donde se saca al primer
“ganador”, ya que prácticamente el método es igual a los descritos de este
grupo con anterioridad.
90
1 33 7 6 -5 3 7 5 4 6 8 9 2 3 9 6
1 6 -5 5 4 8 2 6
1 -5 4 2
-5 2
-5
Heap
Definición del método
Este método consiste en la utilización de un árbol binario, el cual va a estar
constituido de uno o varios subárboles.
El método va a constituir de varios pasos, que son los que a continuación se
describen:
1. Creación del árbol binario.- Se crea un árbol binario, con los
elementos que se van a clasificar, como si fuera el resultado de
haber recorrido el árbol de arriba-abajo (top-down).
2. División en subárboles binarios.- Este árbol se va a ir
descomponiendo en subárboles binarios, pero sólo uno a la vez,
partiendo del nivel mas bajo y siguiendo la secuencia de derecha
91
a izquierda. Estos subárboles serán de tres elementos, solo en el
nivel más bajo podría darse el caso de tener un subárbol de dos
elementos.
3. Reacomodo de los valores de los nodos.- En el subárbol que se
encuentra en el nivel más bajo y más a la derecha del árbol, si
es necesario se realizan los movimientos para cambiar de
posiciones los elementos de los nodos, de tal forma que, el nodo
raíz de cada subárbol quede con un valor mayor o igual a
cualquiera de sus ramas (ascendentemente), o un valor menor o
igual a cualquiera de sus ramas (descendentemente).
4. Creación de la estructura del Heap.- Este procedimiento se va
haciendo, en cada subárbol, siguiendo la secuencia de derecha a
izquierda y hacia arriba, hasta llegar a la raíz principal de todo el
árbol, cuando esto sucede quiere decir que en la raíz principal
del árbol se tendrá al elemento más grande (ascendente) o más
chico (descendente) de todo el árbol. A esta estructura árboles le
conoce como una estructura de Heap.
5. Intercambio del dato de la raíz.- El siguiente paso consiste en
realizar un intercambio del elemento que se encuentra en el nivel
más abajo y más a la derecha, de todo el árbol, por el elemento
que se encuentra en su raíz principal, una vez hecho este
intercambio, se marca de alguna forma el elemento que llegó al
nivel más bajo, con lo que termina cada pasada.
92
En cada pasada se van colocando un elemento, a excepción de la última, en
donde se acomodan dos, por lo que el número de pasadas es de n-1,
considerando que n es el número de elementos, que se van a clasificar.
Ejemplo
Supóngase que se desean clasificar los siguientes datos en forma
descendente:
1, 9. 6, 7, 0, 2, 1, 3, 4, 8
El árbol que se creará es, siguiendo el criterio de que esta lista de datos fue el
resultado de haber recorrido el árbol de arriba-abajo (top-down), de la siguiente
forma:
93
Paso 2: División en subárboles binarios.
Se va dividiendo en subárboles binarios, empezando en el nivel más bajo y en
la dirección de derecha a izquierda, como se muestra a continuación:
9 6
7 0 2 1
3 4 8
94
Figura 2.13. Análisis del primer subárbol binario del método de Heap.
95
Figura 2.14. Análisis del segundo subárbol binario del método de Heap.
Figura 2.15. Análisis del tercer subárbol binario del método de Heap.
96
En esta comparación se intercambia el valor de la raíz por el de su rama
derecha, en este caso el 1 por el 6.
Figura 2.16. Análisis del cuarto subárbol binario del método de Heap.
97
0
1 1
3 9 2 6
7 4 8
PRIMER HEAP
Primer heap
En esta parte de las comparaciones, cuando se llega a la raíz principal del
árbol, se asegura que en esa raíz se encuentra el elemento más pequeño de
todos los que se encuentran en el árbol, ya que en este ejemplo se está
considerando una clasificación descendente (o el más grande si se trata de
clasificar en forma ascendente).
98
Paso 5: Intercambio del dato de la raíz.
La otra mitad es el intercambio del elemento de la raíz por el que se encuentre
más bajo en cuanto a niveles y más a la derecha marcándose de alguna forma
ese elemento que se fue al nivel más bajo, para que no se vuelva a tomar en
cuenta en la siguiente pasada, ya que ocupa su lugar dentro del árbol.
99
Figura 2.19. Análisis del primer subárbol binario, sin contar ya el elemento
marcado.
100
Figura 2.21. Análisis del tercer subárbol binario.
SEGUNDO HEAP
Figura 2.22. Análisis del cuarto subárbol binario y segundo Heap.
101
Se realiza el intercambio de la raíz principal del árbol, por su rama izquierda,
En este ejemplo se intercambia el 8 por el 1 y se obtiene la segunda estructura
del Heap.
SEGUNDO INTERCAMBIO
Figura 2.23. Fin de la segunda pasada del método de Heap.
102
Figura 2.24. Análisis del tercer subárbol binario.
Se vuelven a analizar todos los subárboles del nivel más bajo y de derecha a
izquierda, pero no se realiza ningún intercambio, ya que van cumpliendo con la
estructura del Heap, hasta el tercero, el cual está encerrado en la elipse, en
donde si se tuvo que realizar un intercambio del 3 por el 8, para que cumpla
con el Heap.
3 4
8 9 2 6
7 1 0
TERCER HEAP
Figura 2.25. Análisis del cuarto subárbol binario y tercer Heap.
103
En este ejemplo se realiza el intercambio del 1 por el 4 y se obtiene el tercer
Heap.
TERCER INTERCAMBIO
Figura 2.26. Fin de la tercera pasada del método de Heap.
104
En este ejemplo se lleva a cabo el intercambio del 2 por el 4 y el siguiente
subárbol de ese nivel que se encuentra más a la izquierda (3, 8, 9), ya cumple
con la estructura del Heap, por lo que no se realiza ningún intercambio y se
llega al subárbol de la raíz principal con el intercambio que a continuación se
muestra.
3 7
8 9 4 6
1 1 0
CUARTO HEAP
Figura 2.28. Análisis del tercer subárbol binario y cuarto Heap.
105
CUARTO INTERCAMBIO
Figura 2.29. Fin de la cuarta pasada del método de Heap.
106
QUINTO HEAP
Figura 2.31. Análisis del tercer subárbol binario y quinto Heap.
QUINTO INTERCAMBIO
107
El siguiente subárbol del nivel más abajo y más a la derecha (6,8,9) cumple con
la estructura del Heap. Sólo resta el de la raíz principal, donde se realiza el
siguiente intercambio.
6 7
8 9 3 2
1 1 0
SEXTO HEAP
Figura 2.33. Análisis del segundo subárbol binario y sexto Heap.
SEXTO INTERCAMBIO
Figura 2.34. Fin de la sexta pasada del método de Heap.
108
El subárbol que se analiza para ir formando el siguiente Heap, ya no se
modifica (6,8) y se prosigue a la raíz principal. Donde se realiza un intercambio,
que se muestra enseguida.
SÉPTIMO HEAP
Figura 2.35. Análisis del segundo subárbol binario y séptimo Heap.
109
SÉPTIMO INTERCAMBIO
Figura 2.36. Fin de la séptima pasada del método de Heap.
OCTAVO HEAP
Figura 2.37. Análisis del primer subárbol binario octavo Heap.
110
OCTAVO INTERCAMBIO
Figura 2.38. Fin de la octava pasada del método de Heap.
NOVENO HEAP
Figura 2.39. Análisis del primer subárbol binario noveno Heap.
Al comparar los valores de los dos nodos que quedan (8 y 9), no se realiza
ningún intercambio, ya que como se observa cumple con la estructura de
Heap.
111
NOVENO INTERCAMBIO
Figura 2.40. Fin de la novena pasada del método de Heap.
De igual forma, para localizar la posición del nodo padre o raíz, basta con
conocer la posición dentro del arreglo de la rama izquierda o derecha y dividirla
entre dos, tomando la parte entera.
112
Para que funcione este recorrido en un arreglo de una dimensión y no existan
problemas con el primer elemento, se sugiere almacenar estos elementos a
partir de la posición uno del arreglo, ya que si se empieza en la posición cero,
al multiplicar, siempre dará el valor de cero.
113
pasada, a una octava parte de n y así en cada una de las pasadas, hasta que h
llegue a ser uno.
A continuación, se muestra en forma gráfica el manejo del tamaño de h,
cuando el número de elementos a clasificar es de 8, con lo que le valor de n, se
inicializa. Las comparaciones se darán cada 4 elementos, como se muestra
con las flechas de colores, de tal forma que es el elemento que se encuentra
en la posición 1,se comparará con el que se encuentra en posición 5, el que se
encuentra en la 2 con el de la 6 y así sucesivamente.
shel01
shel02
114
shel03
115
j=h
mientras j < n
i=j–h
k = datos [ j ]
repetir
si k < datos [ i ] // con < es ascendente y
// con > es desc.
datos [i + h] = datos [ i ]
i=i –h
en caso contrario
break // rompe el ciclo de repetir
fin
hasta i <= 0
datos [ i + h ] = k // se realiza el intercambio, en
caso que se de
j=j+1
fin
indice = indice + 1
fin
fin
Ejemplo
El ejemplo que a continuación se presenta, se requiere en forma ascendente y
utiliza los siguientes datos:
Con h = 3
1, 3, 4, 0, 9, 3
116
Se realiza un intercambio 1 por 0 y se comparan los dos datos que siguen:
0, 3, 4, 1, 9, 3
No hay intercambio.
0, 1, 3, 3, 9, 4
No hay intercambio.
Fin de la segunda pasada.
117
Con h = 2
Con h = 1
0, 1, 3, 3, 9, 4
Sin intercambio
0, 1, 3, 3, 9, 4
Sin intercambio
0, 1, 3, 3, 9, 4
Sin intercambio
0, 1, 3, 3, 9, 4
Sin intercambio
0, 1, 3, 3, 9, 4
Se intercambia el 9 por el 4
0, 1, 3, 3, 4, 9
118
del lado izquierdo y los mayores del lado derecho, si se trata de una
clasificación en forma descendente sería al revés, todos los elementos con
valor mayor o igual del lado derecho y los menores del lado izquierdo.
Quick31
Quick32
Estos pasos para colocar el pivote en el lugar que le corresponda se repite para
cada una de las sublistas, que aparecen después de dividir la lista original.
Cada pivote que se vaya colocando se puede ir marcando de alguna forma
119
para ya no tomar en cuenta ese elemento, o bien las sublistas serán las que se
marquen, indicando que en ellas es donde se seguirá aplicando el método.
Donald Knuth, sugiere el uso de una Pila, para dividir la lista, donde cada uno
de sus elementos, es el par de valores de inicio y fin de cada una de las
sublistas.10
Lo que pareciera difícil del método es saber en qué posición dentro de la lista
se colocará el pivote, ya que depende de los valores del resto de la lista, por lo
que es necesario analizar todos los demás elementos antes de colocar dicho
pivote. Pero es bastante sencillo este paso como a continuación se describe:
10
Knuth, Donald E., El arte de programar ordenadores, Volumen III
Clasificación y Búsqueda, (impresión.), ESPAÑA, REVERTÉ, 1987, pag 122-
125
120
La variable i se inicializará en la posición del segundo elemento de la lista o
sublista de datos a clasificar, con el fin de comparar el dato de esa posición con
el valor del pivote, que es donde está apuntando p (p, es la dirección dentro
del arreglo, y pivote es el valor del elemento que está siendo apuntado por p).
121
dicha sublista. También es importante resaltar que los elementos de la lista se
encuentran almacenados a partir de la dirección cero.
Ejemplo
A continuación se presenta un ejemplo, el cual se clasificará en forma
ascendente con los siguientes datos:
122
caso a 73 (valor del pivote apuntado por p) y se detiene en 67, porque ya no
cumple con esa condición.
Se realiza el intercambio del elemento que está apuntando d por el que está
apuntando i.
123
En este momento se traslapan los apuntadores i y d, siendo i mayor a d, con lo
cual ya se sabe en qué posición debe quedar el pivote.
Ahora la pila tiene dos elementos, ya que la lista se dividió en dos sublistas,
siendo, la primera de ellas los elementos que se encuentran de la posición 0
124
(cero) a la 5 y la segunda de ellas los elementos que se encuentra de la
posición 7 a la 10.
125
Se realiza el intercambio del elemento apuntado por p y por el de d, marcando
el pivote que es el 26 por quedar en la posición que le corresponde con color
marrón, en esta ocasión, también se marca el 01, ya que quedaría en una
sublista de un solo elemento, ya que si existe un solo elemento en una sublista
esta se encuentra ya clasificada, por no tener otro elemento contra quien
comparar.
126
Se acomoda el pivote, se marca con color marrón y el elemento de la pila, se
actualiza con los nuevos valores de los límites de la nueva sublistas (ahora 2 y
4).
Fin de la tercera pasada.
127
Se realizaría el intercambio de lo que apunta p por lo que apunta d, pero como
están apuntando a la misma posición, no se hace ningún intercambio.
Solamente se marca y se actualiza el límite de la sublista.
Se inicializan apuntadores.
Se traslapan apuntadores.
128
Fin de la quinta pasada.
Apuntadores inicializados.
129
i>d
Apuntadores inicializados.
130
Se realiza el intercambio de lo que apunta p por lo que apunta d, quedando
marcado con color marrón, el pivote, que es el valor de 95 y como el 94 es un
solo elemento, también queda marcado. La pila queda vacía y termina la
ejecución de este método.
Este método, parece complicado, pero en realidad, es uno de los más rápidos,
en cuanto a su ejecución, no es tan difícil programarlo.
131
Finalmente el del nombre, para que al final de estas cuatro clasificaciones, se
tuvieran listas de grupos (que son las que se les dan a los profesores) donde
vendrían todos los alumnos de una determinada carrera, materia, grupo y
además en orden alfabético (puede ser en forma ascendente o descendente).
9
Alfred V. Aho, et al., op. cit., pp.16-21.
132
sencillo ó complejo, de acuerdo a los requerimientos específicos de
cada programa.
Medición del tiempo de ejecución de un programa. Tal vez este sea uno de los
parámetros, más significativos parta medir la eficiencia del un algoritmo y
depende de entre otros factores de los siguientes:
En este último apartado, uno de los factores que más se utiliza para evaluar el
tiempo de ejecución de un programa, es el “tamaño” de la entrada, la cual es la
longitud de elementos de que consta y generalmente se denota por la letra n y
se acostumbra utilizar la notación T(n), para el tiempo de ejecución de un
programa con una entrada de tamaño n.
133
Se puede considerar a T(n) como el número de instrucciones ejecutadas en
una computadora idealizada. Este tiempo de ejecución del programa, no
depende sólo del tamaño de la entrada, si no que también es una función de
ella. Se define también a T(n) como el tiempo de ejecución, considerándolo
como el peor de los casos, esto quiere decir que es el máximo valor del tiempo
de ejecución para entradas de tamaño n.
134
2
de ejecución de un programa tarda 100 n y otro programa que realiza la
3
misma función con otro algoritmo tarda 5 n (utilizando ambos las mismas
unidades de tiempo como por ejemplo milisegundos).
2 3
En este ejemplo, aparentemente 100 n es mejor que 5 n , paro si se evalúa,
3
para tamaños de entrada n < 20, el segundo programa, a pesar de ser O(n ),
2
es más rápido, que el primer programa que tiene O(n ), debido precisamente
al factor por el cual se está multiplicando (100 o 5).
Pero para n = 20 los dos programas tienen el mismo valor de tiempo (40 000
2
unidades de tiempo) y a partir de n > 20, O(n ) es más rápido, que el programa
3
de O(n ).
2
Si no tuviera esa factor siempre se cumpliría que O(n ) es más rápido, que el
3
programa de O(n ), debido a que a medida que crece el tamaño de la entrada
3
n, el programa de O(n ) requiere un tiempo mucho mayor que el programa que
2
utiliza la función O(n ), debido, precisamente a la potencia a la cual esta
elevado n.
También existe el criterio de que los mejores métodos cumplen con la función:
135
Calcular el tiempo de ejecución de un programa puede llegar a ser un proceso
muy complejo, pero ya existe toda una teoría para aplicar algunos principios
como es el de sumar y el de multiplicar en notación asintótica, como por
ejemplo en la suma, se ocupa para la ejecución de una secuencia de pasos del
programa y se toma el tiempo de la función O (Mayúscula) máxima de todas
las que componen a esta secuencia, como el tiempo de ejecución de toda la
secuencia.
Ya existen para algunos algoritmos muy comúnmente utilizados, como son los
de clasificación (objeto de este tema) que en algunos de ellos, ya se ha
realizado un estudio para obtener estas funciones de tiempo.
Los métodos que se trataron en este capítulo, ya son muy estudiados y por lo
mismo sus funciones de comportamiento ya se tienen definidas, en seguida se
mencionaran las más comunes de estos métodos.
Análisis de la Burbuja
Este método es muy sencillo de programar, puede llegar a ser muy rápido en
cuanto a su ejecución, pero va a depender del número de datos denominado
n, que va a clasificar, ya que a mayor cantidad de datos el método va siendo
más lento.
136
de intercambios, se reduce en función de que los datos no vengan tan
“desordenados”, esto es que vengan muy cercanos a la posición que le
correspondan, ya una vez clasificado, como se vio en el ejemplo, desde la
tercera pasada, ya se encontraban clasificados, pero fue necesario realizar
todas las pasada, sin embargo, ya no se hizo ningún intercambio.
12
n2 / 4
12
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 152
137
Después de un análisis muy completo se ha encontrado que el total de
comparaciones es de:
(n 2 n )
2 13
13
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 143
138
Existen varias pasadas, siendo para la primera el número de comparaciones,
que se obtiene de la multiplicación del número de grupos por el número de
comparaciones con lo que se obtiene n-1.
14
(n-1) + (n-1) * [ 2 n - 1) ]
Análisis de Torneo
En el nivel más bajo del árbol, también conocido como último nivel u, el número
de comparaciones es n/2, en el nivel u -1 es n/4 y así sucesivamente hasta que
se llega al nivel 2, donde sólo se requerirá de una comparación, por lo que el
número de comparaciones en total en la primera pasada es:
14
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 145
139
Y el número de comparaciones finalmente resulta:
15
log 2 (n)
15
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 148
16
idem, op. cit., p. 150
140
Unas secuencias recomendables para los valores h son:
ele =2 entonces h 1 = 1.72 3
n y h 2 = 1, utilizando estos valores, el número de
5
comparaciones es proporcional a n 3 . Recordando que ele, es la variable que
indica cuantos elementos tiene el arreglo donde se guardan los incrementos h.
En caso de ocupar más de dos incrementos la secuencia de valores es h(k) =
2 k - 1 para 1 <= k <= log (n), el número de comparaciones es:
3 17
2
n
17
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 159
141
(n 2 n )
2
Selección Mediana n n Mediana Alta Alto
Repetitiva
n3 n
Torneo Alta n log 2 n Alta Alta Alto
Shell Baja 3
2 Alta Alta Alto
n
142
A continuación, se presentan algunas salidas de un programa, que fue
desarrollado en C en diferentes escalas. Este tipo de gráficas, permiten tener
más elementos de decisión, para ver hasta que número de elementos conviene
utilizar uno u otro de los métodos vistos con anterioridad.
143
Figura 2.46. Gráfica del comportamiento de métodos de clasificación
X=10, Y=5
144
GRÁFICA DEL COMPORTAMIENTO DE METODOS DE CLÁSIFICACIÓN.
Proporcione la escala en x 20.000000
Proporcione la escala en y 15.000000
145
Las graficas que se presentan en las figuras anteriores indican con diferentes
símbolos la respuesta de cada uno de los métodos y al principio cuando se
tienen pocos elementos van muy parejos en su tiempo de respuesta, pero
conforme aumentan las llaves o datos a clasificar, el método de la burbuja va
tardando más en ejecutarse, en tanto que el Shell, es el que más rápido se
ejecuta, sobre todo cuando el número de elementos aumenta.
Se utilizaron estos tres métodos, por ser muy similares en lo que se refiere a la
ocupación de memoria adicional, los tres lo hacen sobre el mismo arreglo.
En este tema se trataron los métodos más conocidos, pero cabe mencionar
que sólo es una muestra algunos de ellos, ya que existen muchos más, tanto
internos como externos.
146
Bibliografía del tema 2
AHO, Alfred V., et al.,Estructuras de Datos y Algoritmos, Estados Unidos,
Addison-Wesley Iberoamericana, 1988, pp. 438.
EUÁN ÁVILA, Jorge Iván y CORDERO BORBOA, Luis Gonzaga, Estructuras
de datos, México, Limusa, 1989, pp. 219.
KNUTH, Donald E., El arte de programar ordenadores, Volumen III
Clasificación y Búsqueda, (impresión.), España, Reverté, 1987, 776
pp.
Actividades de aprendizaje
A.2.1. Elabora un mapa conceptual del tema.
A.2.2. A partir del código del programa, donde se implanto el algoritmo de
burbuja, realiza el pseudocódigo correspondiente.
A.2.3. A partir del pseudocódigo del algoritmo del método de Inserción Directa,
codifícalo en un programa en C.
A.2.4. A partir del código del programa donde se implanto el algoritmo de
Selección Directa, realiza el pseudocódigo correspondiente.
A.2.5. Modifica el pseudocódigo del algoritmo de Selección Repetitiva, donde
se empiece con índices de los arreglos en uno y no en cero, como está hecho
el que se presentó.
A.2.6. A partir del método de Selección Repetitiva modifícalo para que ahora la
clasificación sea en forma descendente, solo en pseudocódigo. Empezando
con los índices en ceros.
A.2.7. Codifica en C, el algoritmo de Selección Repetitiva para que los datos
queden en forma descendente y empezando en índices en ceros.
A.2.8. Modifica el pseudocódigo, del algoritmo de Selección Repetitiva, de tal
forma, que se contemple el caso de cuando la raíz cuadrada del número de
elementos n, no sea un número entero exacto (esto es que tenga fracciones),
por ejemplo n = 10, su raíz cuadrada sería 3.1622.
A.2.9. Realiza el pseudocódigo del algoritmo de Selección Repetitiva, cuando
se tenga una raíz cúbica de n ( 3 n ).
147
A.2.10. Retoma el pseudocódigo del método de Selección Repetitiva,
modifícalo, para obtener el del método de Torneo.
A.2.11. Encuentra el pseudocódigo del método de Torneo, para contemplar el
caso de que no se trate de un árbol binario completo, esto es que el número de
elementos n, que se van a clasificar no sean (2 n -1), con lo cual no se tendrán
grupos completos de dos elementos y va a ser necesario, marcarlos con infinito
( ).
A.2.12. Realiza el pseudocódigo, del método del Heap.
A.2.13. Utiliza el método del Shell para clasificar los siguientes elementos en
forma ascendente:
4, 6, 3, 2, -9, 1, 9, 7, 8, 5, 0
los incrementos h que se van a utilizar son:
6, 3, 2, 1 o 5, 3, 2, 1
Observe los resultados y vea que tomando diferentes incrementos,
puede o no clasificarse correctamente los datos.
A.2.14. Utiliza el método del Shell, con los mismos datos, pero con la siguiente
distribución. Clasifícalos también en forma ascendente:
0, 4, 6, 3, 2, -9, 1, 9, 7, 8, 5
los incrementos h que se van a utilizar son:
6, 3, 2, 1
148
printf("\n\t*** los elementos desordenados son ***\n");
for (k=0;k < num; k++)
printf (" %d ",a[k]);
printf("\n\n");
h=num;
principio = clock();
while (h > 0)
{
h=h/2; //Se va dividiendo entre dos los incrementos y en
//el pseudocodigo estos valores estan en un arreglo
for (j=h; j <= num; j++)
{
delay(10); // Aqui se retrasa 10 unidades
i=j-h;
k=a[j];
do
{
if (k < a[i])
{
a[i+h]=a[i];
i=i-h;
}
else
break;
} while (!(i<=0));
a[i+h]=k;
}
}
fin = clock();
num=num-1;
printf("\n\t*** los elementos ordenados en forma");
printf(" asecendente son ***\n");
for (k=0;k <= num; k++)
printf (" %d ",a[k]);
nele[2][z]=num+1;
ntiempo[2][z]=((fin - principio)) / CLK_TCK ;
printf("\n\n");
printf("\n\t*** El tiempo de ejecucion en decimas de segundos\n");
149
printf("\t\ten forma ascendente fue de: %7.5f ",((fin - principio))
/ CLK_TCK);
printf("****");
}// fin de shell
150
2. Nombre compuesto de apellido paterno, materno y nombres de treinta
caracteres alfabéticos.
3. Clave de la carrera de tres posiciones numéricas.
4. Clave de la materia también de tres posiciones numéricas.
5. Número de grupo de dos posiciones numéricas.
Como salidas serán las listas que se les proporciona a los profesores para su
control escolar. Estas listas, deberán de estar en orden alfabético los nombres
de los alumnos y se desplegarán los nombres de los alumnos, la clave de la
materia, la clave de la carrera y el número de grupo. .
Cuestionario de autoevaluación
151
Examen de autoevaluación
152
TEMA 3. MÉTODOS DE BÚSQUEDA
Objetivo particular.
Al concluir este tema, el alumno será capaz de:
Conocer los métodos más importantes de búsqueda y aplicar el más
conveniente al conjunto de datos que se encuentran, ya sea en memoria
principal o en la memoria secundaria, así mismo manejará las funciones de
dispersión.
Temario detallado
3.1. Búsqueda secuencial
3.2. Búsqueda binaria
3.3. Búsqueda mediante transformación de llaves (Hashing)
3.3.1. Función hash
3.3.2. Resolución de colisiones
3.4. Árboles binarios de búsqueda
Introducción
Una de las funciones que con mayor frecuencia se utiliza en los sistemas de
información, es el de las consultas a los datos, se hace necesario utilizar
algoritmos, que permitan realizar búsquedas de forma rápida y eficiente.
18
Jorge Iván Euán Ávila y Luis Gonzaga Cordero Borboa , op. cit., p. 181
153
Lineal (secuencial)
Comparación
de llaves Binaria
Búsquedas
Funciones de
Transformación
Hash o Dispersión
de llaves
o de Mapeo
154
En este tipo de listas los elementos pueden o no estar clasificados, ya que se
empieza a comparar de uno en uno los elementos de la lista y no importa su
orden para realizar la búsqueda, salvo para el tiempo de ejecución.
Si el elemento que se está buscando, se encuentra al inicio de la lista, este
tiempo, sería muy corto, pero si se encuentra al final, va a tardar más y si el
elemento que se desea buscar, no se encuentra en la lista, se hizo necesario,
recorrer toda la lista, para darse cuenta que no está en ella.
Y si se le aumenta a esto, que el número de elementos en la lista puede ser
del orden de cientos o miles, va a hacer mucho más tardado su ejecución.
inicio
i=0
bandera = 0
mientras i < n
si k [ i ] = x
inicio
desplegar “búsqueda exitosa y el dato es” x
desplegar “y se encuentra en la posición” i
i=n
bandera = 1
else
i=i+1
fin
fin
si bandera = 0
desplegar “no se encontró el dato en la lista”
fin
155
Para este pseudocódigo, se considera que se tienen n nodos (conjunto de uno
o varios campos) en una lista como:
n 0 , n 1 , n 2 , …. n n 1
n/2
Ejemplos:
Supón que se tienen los siguientes datos (no forzosamente clasificados):
Solución A)
156
2
Solución B)
157
En la octava comparación se encuentra el elemento 8 (ocho) que está en la
posición 7 (siete).
Solución C)
158
Solución D)
159
Este algoritmo requiere que los elementos de la lista, sobre la que va a actuar,
estén clasificados, ya sea en forma ascendente o descendente, cada elemento
de la lista puede tener varios campos. La lista se considera que empieza a
almacenar sus elementos en la posición cero.
160
a considerar esta nueva lista, que es la segunda mitad, como la
nueva lista.
Que el elemento buscado ahora sea menor que el elemento
apuntador por M, entonces, se desechará la segunda mitad de
la lista y el apuntador que se actualizará será entonces LS, que
es el que apuntaba al último elemento y ahora se moverá a una
posición inmediata anterior a donde está apuntando M.
inicio
LI = 0
LS = n – 1
mientras LI LS
161
Análisis de la Búsqueda Binaria
Este método en cada iteración el intervalo de búsqueda se divide por mitad, por
lo que el número de comparaciones tiende a:
log 2 n
Ejemplos:
Se tienen los siguientes elementos de una lista, clasificada en forma
ascendente:
Solución A)
M= Parte Entera ( ( LI + LS ) / 2)
M= Parte Entera ( ( 0 + 12 ) / 2) = 6
Solución B)
162
2
El elemento apuntado por M (9) es mayor al valor del elemento dato (3) y como
la lista se encuentra clasificada en forma ascendente, entonces se va a
desechar la segunda mitad de ésta.
M= Parte Entera ( ( 0 + 5 ) / 2) = 2
Solución C)
M= Parte Entera ( ( 0 + 12 ) / 2) = 6
163
El elemento apuntado por M (9) es menor al valor del elemento dato (21) y
como la lista se encuentra clasificada en forma ascendente, entonces se va a
desechar la primera mitad.
y como el valor que esta apuntado por M (16) es menor que el valor del dato
(21), se descarta la primera mitad de esta nueva lista.
164
8
Como el dato (21) es mayor que el valor que apunta M (19) se desecha la
primera mitad.
10
Se calcula nuevamente M:
M= Parte Entera ( ( 12 + 12 ) / 2) = 12
Solución D)
165
2
M= Parte Entera ( ( 0 + 12 ) / 2) = 6
El elemento apuntado por M (9) es menor al valor del elemento dato (18), se va
a desechar la primera mitad.
Se calcula M como:
M= Parte Entera ( ( 7 + 12 ) / 2) = 9
Como el valor que está apuntado por M (16) es menor que el valor del dato
(18), se descarta la primera mitad de esta nueva lista.
166
7
11
Se actualiza la posición de LI, un lugar antes de M.
12
Se calcula nuevamente M:
M= Parte Entera ( ( 10 + 10 ) / 2) = 10
167
13
168
Entre las desventajas se encuentran:
- Tener que definir un campo llave, que recordando del primer capítulo, es
aquel que aparece en todos los registros o nodos de la lista, pero cuyo
contenido no se repite.
- La eficiencia de este tipo de búsquedas, va a depender de que tan robusta
sea la función HASH, que va a transformar la llave para indicar la posición en la
cual se encuentra el elemento buscado, lo ideal es que sea de uno a uno, esto
es que para cada valor de llave, esta función la transforme e indique en qué
posición va encontrar ese registro.
Es importante hacer notar que la misma función de Hash, que se utiliza, para
almacenar, es la misma que se ocupa para recuperar la llave (considerando
que sólo se está almacenando por la llave, pero que puede ser un registro o
estructura que puede contener varios campos).
169
almacenará el registro, pero se puede presentar el caso de que la dirección ya
esté ocupada por otro elemento, como sería el siguiente caso:
Lo que implicaría que estas dos llaves, con valores diferentes, deberían de
estar en la misma dirección, a este suceso se le conoce como colisión.
Existen diferentes formas de resolver las colisiones entre las más comunes se
tienen las de direccionamiento abierto y las de encadenamiento.
170
Pero si el valor de la llave estuviera en un rango, en donde no se ocuparan
todos los valores, por ejemplo el número de cuenta de los clientes de tarjetas
de crédito de un banco, donde aparecen una gran cantidad de dígitos y pueden
que no sean consecutivos, ya que los dos primeros dígitos pueden indicar a lo
mejor el número de la sucursal, los otros dos, el tipo de tarjeta (por ejemplo
Master Card ®, Visa ®, etc.), los otros dos, a lo mejor el tipo de moneda
(pesos, dólares, euros, etc.), entonces no se podría utilizar toda la llave, como
función de Hash, ya que habría mucho desperdicio de memoria, por los rangos
que no se llegan a utilizar.
171
arreglos con índices a partir de cero, como lo hace C, no hay problema, pero si
se trata de arreglos como los que utilizan otros lenguajes como FORTRAN, que
empiezan en el índice uno será necesario, al resultado de la transformación
sumarle uno, para evitar los índices inválidos.
Es importante resaltar, que la suma puede involucrar todos los dígitos o sólo
algunos de ellos.
Ejemplo
Supóngase que se tienen las siguientes llaves (K):
K1 = 125
K2 = 239
K3 = 005
172
Al aplicar la función de Hash a cada llave las salidas son:
H ( K1) = H (125) = 1 + 2 + 5 = 8
H ( K2) = H (239) = 2 + 3 + 9 = 14
H ( K1) = H (005) = 0 + 0 + 5 = 5
Ejemplo
Se tienen las siguientes llaves (K):
K1 = 125
K2 = 239
K3 = 005
173
Al aplicar la función de Hash a cada llave, las salidas son:
El registro cuya llave es 125 debe estar en la dirección 156, el de la llave 239
en la 571 y para la 005 en la 25.
Ejemplo
En este ejercicio la función de Hash indica que la transformación es la
multiplicación del valor de la llave por una constante que se supondrá con el
valor de 17 y que se tomaran los últimos tres dígitos del resultado, para
obtener la dirección del registro a donde pertenece esa llave.
NOTA: Hay que tener en cuenta que cuando se separan los dígitos de la llave
y se multiplican entre una combinación de ellos puede darse el caso de que
aparezcan muchos valores en ceros.
Por ejemplo, si se multiplicara el primero por el tercer dígito y las llaves están
en el rango de 0 a 999, entonces los primeros cien elementos, van a dar cero,
174
aparte de los que terminen sus llaves en cero o su segundo dígito también
fuera cero.
Se sugiere para evitar o reducir las colisiones y para que se distribuyan más
uniformemente los elementos, que el divisor sea un número primo cercano a la
longitud de elementos del arreglo o del archivo, según sea el caso.
Es importante resaltar que el residuo va a variar entre cero y el valor del divisor
menos uno, pero que finalmente se tendrán un rango de valores igual al valor
del divisor.
Ejemplo
Se tienen las siguientes llaves (K):
K1 = 125
K2 = 239
K3 = 005
H (K) = K mod N
175
H ( K1) = H (005) = 5 mod 5 = 05
Se observa que apareció con esta función de Hash, una colisión, ya que para
las llaves 125 y para la 5, indica que deben estar las dos en la dirección 5, pero
en una dirección solo puede estar un elemento, no más.
Así como se tomó el residuo, para la función módulo, también se pudo haber
empleado la división y tomar la parte entera del cociente, en todos sus dígitos o
algunos de ellos.
Ejemplo:
Se tienen las siguientes llaves (K):
K1 = 125
K2 = 239
K3 = 005
La función de Hash indica que la transformación es el cambio de base con
todos sus dígitos del valor de la llave que se encuentra en base diez y se va a
cambiar a base cuatro.
176
H (K) = cambiar de baseOrigen a baseDestino a K
H (K) = cambiar de base 10 a base 4 a K
El registro cuya llave es 125, debe estar en la dirección 1331, el de la llave 239
en la 3233 y para la 005 en la 11.
177
Ejemplo
Se tienen las siguientes llaves (K):
K1 = 125
K2 = 239
K3 = 005
La función de Hash indica que la transformación es agrupar conjuntos de dos y
otro de uno elemento, aplicar la operación suma y del resultado tomar sólo los
dos últimos dígitos.
Es uno de los métodos más sencillos, pero como los dígitos pueden venir
aleatoriamente, la distribución a veces no es tan uniforme y pueden llegarse a
presentar una gran cantidad de colisiones.
Ejemplo
Se tienen las siguientes llaves (K):
K1 = 125
178
K2 = 239
K3 = 005
Esto demuestra que no hay alguna regla que indique cual es la mejor forma de
realizar la función de mapeo o de Hash y que inclusive se pueden realizar con
combinaciones de las diferentes funciones que se presentaron o tomar una
mayor o menor cantidad de dígitos de los resultados.
179
Para realizar lo más eficientemente posible la función de mapeo, existen
algunos conceptos de la Probabilidad y Estadística, que pueden ser de gran
ayuda, como por ejemplo para el análisis de la distribución de los datos y los
criterios para el tamaño y toma de la muestra.
Sin embargo no se asegura la eliminación de las colisiones.
Para las búsquedas por transformación de llaves se sugiere que para aumentar
la eficiencia de los algoritmos de búsqueda por transformación de llaves se le
asigne a la tabla un número de localidades de almacenamiento mayor al
número elementos que se desean almacenar. Se puede establecer la
proporción de la tabla que está ocupada por un factor de carga expresado
como:
En muy buena medida para que al algoritmo de este tipo de búsquedas tenga
una mayor eficiencia, va a depender de la función de mapeo o de Hash y de la
forma de resolver las colisiones. Idealmente se desea que no se presenten
colisiones, pero no siempre se logra, en caso de presentarse, se busca que
sean las menos posibles y resolverlas con una técnica eficiente.
19
Ibidem, p. 192.
180
Para poder resolver el problema de las colisiones se busca alguna dirección
que se encuentre desocupada cercana a la posición en donde debe de estar el
nodo o la estructura (de acuerdo a la que proporcione la función de Hash).
Direccionamiento Abierto
Consiste en revisar las direcciones de la tabla (así se le puede llamar al archivo
o al arreglo donde se esté almacenando y/o recuperando las llaves
procesadas) en forma secuencial, partiendo de la dirección donde ocurrió la
colisión (misma dirección para más de una llave diferente), hasta encontrar el
elemento deseado si se trata de una búsqueda o bien encontrar un espacio
libre si es el caso de almacenamiento.
Tal vez sea la forma más sencilla para resolver las colisiones, pero tiene la
desventaja de que si se presentan varias colisiones, entonces se empiezan a
agrupar nodos o elementos alrededor de una misma dirección (clustering), en
forma contigua y al realizar otra consulta, esta se puede llegar a convertir en
una búsqueda secuencial o lineal, llevando esto el consumo de más tiempo de
ejecución del algoritmo y con el consiguiente aumento en el tiempo de
respuesta de la consulta.
181
En el peor de los casos, si se presentaran muchas colisiones, es posible que se
le tenga que dar toda una vuelta a la tabla para encontrar el nodo deseado.
Encadenamiento
En esta forma de solución de colisiones se crea una lista simplemente ligada,
para cada dirección que se repita, esta lista ligada, indicará cual es la dirección
del siguiente elemento que debió de haber estado en la localidad donde se esté
originando la colisión, con esto ya no se realiza una búsqueda secuencial,
elemento por elemento, si no que se recorre la lista ligada a través de las
direcciones de las ligas hasta que encuentre la dirección NULL o Nulo,
logrando una mayor velocidad de esta técnica. Pero tiene la desventaja de que
ocupa un espacio de memoria mayor para almacenar la liga y que el algoritmo
se vuelve un poco más complejo comparado con el de Direccionamiento
Abierto.
182
- Los puntos, también llamados vértices, nodos, o unión.
- Las líneas que unen a los puntos, conocidas como arcos, ramas o elementos.
Por ejemplo:
V = (v1, v2, v3, v4, v5, v6, v7, v8)
E = (e1, e2, e3, e4, e5, e6, e7, e8)
Árboles.
183
El número de vértices n que contiene es igual a n-1 arcos.
La suma de los grados de todos los vértices es 2(n-1), donde n es el
número de vértices del grafo.
Los nodos que tienen descendientes se les conocen como nodos padres y a
los descendientes como nodos hijos. Un nodo padre puede tener 0 (cero) o
varios descendientes, pero un nodo descendiente no puede tener más que a un
solo nodo padre. No existe ninguna relación entre los nodos del mismo nivel,
solo hacia sus descendientes o ascendentes.
184
Representación de árboles
Un árbol se puede representar en forma gráfica ya sea en forma de barras o de
conjuntos.
a
a
b
d b
a
e
b d
c e
c
e c
d
185
Árboles binarios
Para los árboles estrictamente binarios y binarios, se pueden ocupar los cinco
tipos de recorridos clásicos, que son los que describen los siguientes
algoritmos:
- Arriba-abajo.- el recorrido es partiendo de la raíz hacia abajo y de izquierda a
derecha.
- Abajo-arriba.- parte del nivel más bajo hacia arriba y de izquierda a derecha.
- Preorden.- visitar raíz, recorrer rama izquierda y recorrer rama derecha.
- Inorden.- recorrer rama izquierda, visitar raíz y recorrer rama derecha.
- Posorden.- recorrer rama izquierda, recorrer rama derecha y visitar raíz.
186
El dato de la rama derecha es mayor al de la raíz.
1
Figura 3.4. Árboles de búsqueda binaria (ABB)
2
Figura 3.5.Diferentes representaciones de un árbol binario de búsqueda
187
El recorrido Inorden de cualquier de estos árboles binarios de búsqueda,
produce la misma secuencia clasificada en forma ascendente.
Operaciones
Existen diferentes operaciones que se pueden realizar en este tipo de árboles,
entre las que se encuentran:
Búsquedas.
Inserciones.
Bajas
Búsquedas
188
Ejemplo
Inserciones
Para insertar un elemento se utiliza el algoritmo de búsqueda, ya que si el
elemento no está en el árbol, es insertado a continuación del último nodo
visitado, en caso contrario no se realizará acción alguna.
189
Se requiere de un apuntador auxiliar, para conservar una referencia al padre
del nodo raíz actual. El valor inicial para ese apuntador es NULL.
inicio
padre = NULL
nodo = dirección de la raíz
mientras el nodo actual sea diferente de NULL (no sea un árbol vacío) o hasta
que se encuentre el elemento.
si el valor del nodo es > que el elemento buscado // nodo esta
//apuntando a la raíz actual
padre = nodo //continua la búsqueda en el árbol izquierdo
nodo =Liga Izquierda ( nodo )
en caso contrario
padre = nodo //continua la búsqueda en el árbol derecho
nodo=Liga Derecha (nodo)
fin
fin
si nodo es diferente de NULL
el elemento existe en el árbol
desplegar “no se inserta el elemento, ya existe”
en caso contrario
si padre = NULL //el árbol estaba vacío, por lo tanto, el nuevo árbol
//sólo contendrá el nuevo elemento, que será la raíz
//del árbol
insertar dato en la raíz principal del árbol
en caso contrario
si elemento < padre //entonces se inserta el nuevo elemento como
//un nuevo árbol izquierdo del padre
insertar dato como nuevo árbol izquierdo del padre
190
en caso contrario
//entonces se inserta el nuevo elemento
//como un nuevo árbol derecho del padre
insertar dato como nuevo árbol derecho del padre
fin
fin
fin
fin
Bajas
Para borrar un elemento o nodo también se necesita de la función de
búsqueda, ya que si el elemento no está en el árbol no se puede borrar.
Hay dos alternativas:
1. Se trata de un nodo hoja (aquel nodo que ya no tiene descendientes), se
puede borrar directamente.
2.. En caso de tratarse de un nodo que sea una rama, no se puede eliminar
directamente ya que se perderían todos los elementos de ese subárbol.
Se procede a buscar el nodo más a la izquierda del subárbol derecho, o el que
está más a la derecha del subárbol izquierdo y se intercambian sus valores.
Procediéndose a eliminar el nodo hoja.
.
Nuevamente se hace uso de un apuntador auxiliar para conservar una
referencia o dirección al padre del nodo raíz actual y se inicializa con un valor
de NULL (Nulo).
191
izquierda y otro que será la Liga Derecha, que apuntará a la rama derecha de
dicho nodo.
Estas ligas, que en realidad son apuntadores dentro de cada nodo, pueden
tener un valor de NULL, cuando no exista alguna o las dos ramas como a
continuación se ejemplifica en la ilustración de un nodo.
La Liga Izquierda o Derecha del nodo padre que apuntaba a nodo, ahora
apunte a NULL. En este ejemplo fue la liga derecha.
192
6
Se elimina el nodo.
193
1.- Se localiza el nodo a borrar y es apuntador por raíz.
2.- Se busca el nodo más a la derecha del árbol izquierdo de raíz, en este caso
el 5 y ahí queda el apuntador de nodo, se conserva un apuntador al nodo
padre de nodo, al cual se denomina padre.
194
3.- Se intercambia el dato de nodo por el de raíz
10
11
195
5.- Se borra el nodo
12
Sobre todo, es importante conocer estos conceptos de los tres temas de este
apunte, porque aún utilizando herramientas de tecnología de punta, como son
los manejadores de Bases de Datos o lenguajes de cuarta generación (4GL),
etc., el contar con los conocimientos de archivos, búsquedas y clasificación
(ordenamientos), ayudan a aprovechar mejor el uso de estas herramientas
modernas.
196
Para finalizar se cierra con la siguiente frase de Ackoff que dice: “se ha
observado que es más frecuente no enfocar el problema correcto, que fallar en
la solución del problema que se enfoca”.3, por lo que es importante contar con
herramientas que ayuden en la solución del problema como las que se
mencionan en este trabajo, en cuanto a algoritmos y Estructuras de Datos se
refiere, pero también es importante desarrollar las habilidades, para hacer un
buen planteamiento y formulación del problema.
Actividades de aprendizaje
A.3.1 Elabora un mapa conceptual de este tercer tema.
A.3.2 Realiza un programa en el lenguaje de programación C para
implementar la búsqueda binaria, partiendo del pseudo código visto en
este tema
A.3.3 Implementa un programa C para desarrollar la búsqueda en un árbol de
búsqueda binaria, utilizando la sentencia struct.
A.3.4 Explica cómo se clasifican los métodos de búsqueda.
A.3.5 Describe en qué consiste cada uno de los métodos utilizados para
resolver las colisiones.
3
Ackoff Rusesell L. Ackoff, El arte de resolver problemas, pp.25-26.
197
Cuestionario de autoevaluación
198
Examen de autoevaluación
Relaciona la columna de la izquierda con la de la derecha y coloca la respuesta
que consideres correcta dentro del paréntesis.
( ) 1. Árbol cuya rama izquierda tiene un a) Árbol binario
valor menor y la rama derecha mayor al de
su raíz
( ) 2. Son los elementos de un Grafo b) Encadenamiento
199
BIBLIOGRAFÍA BASICA:
200
BIBLIOGRAFÍA COMPLEMENTARIA
SITIOS DE INTERÉS
http://www.ujat.mx/oferta_educativa/dacbas/programas_sinteticos/matematicas/
sustantiva_profesional/F0057_programacion2.pdf
http://www.ujat.mx/oferta_educativa/dacbas/programas_sinteticos/matematicas/
sustantiva_profesional/F0057_programacion2.pdf
http://www.conclase.net/c/edd/index.php?cap=007
http://www.monografias.com/trabajos7/arch/arch.shtml
201
Soluciones a algunos ejercicios de las actividades complementarias al
aprendizaje.
Actividad 2.6.
inicio
indice=0
i= n
p=0
k =1-i
j=1
hacer mientras ( j i )
p=p+1
k=k+i
m=k
c = k +1
hacer mientras ( c ( k + i – 1 ) )
si datos [c] < datos [m] entonces
m=c
fin
c=c+1
fin
j = j +1
ganadores [p][1] = datos [m]
ganadores [p][2] = m
fin
j=1
hacer mientras ( j n )
m=1
c= m +1
hacer mientras ( c i ) // se seleccionan el ganador de los
ganad.
si ganadores [c][1] < ganadores [m][1]
202
m=c
fin
c=c+1
fin
p=m
indice = indice + 1
menor [indice] = ganadores [m][1] // es el ganador de todos
datos [ ganadores [m][2] ] = infinito
k=i*(m –1)+1
m=k
c= m +1
hacer mientras ( c ( k + i – 1 ) )
si datos [c] < datos [m]
m=c
fin
c=c+1
fin
ganadores [p][1] = datos [m]
ganadores [p] [2] = m
j=j+1
fin
fin
203
RESPUESTAS A LOS CUESTIONARIOS DE AUTOEVALUACIÓN. INFORMÁTICA III
204
Tema 1
1. Archivo es un conjunto de uno o varios registros semejantes, también se puede definir como una colección de
datos relacionados entre sí, que pueden utilizarse de una misma forma.
2. Es el número de registros lógicos que caben en un registro físico.
3. Son los valores permitidos que pueden tomar esos datos y las operaciones que se puedan llevar a cabo sobre
estos valores.
4. Entrada, salida y de entrada/salida
5. Reestructuración y reorganización.
6. Es la forma en la que los registros, se acomodan o almacenan en los dispositivos de almacenamiento o bien
como se estructuran los datos dentro de un archivo.
205
Tema 2
1. Los métodos internos solo utilizan memoria principal, en tanto que los métodos externos, manejan
memoria principal y secundaria.
2. Son: Selección, Intercambio, Inserción, Distribución y Mezcla.
3. El clasificar (ordenar) es acomodar estos elementos, para que queden de acuerdo a un orden
preestablecido, el cual puede ser ascendente o descendentemente.
K 1 K 2 K 3 , .. K N
5. Descendentemente, los valores de los datos, de la lista K, quedan de la siguiente forma:
K 1 K 2 K 3 , ... K N
6. De dos.
206
posibilidad del éxito del método, se sugiere que estos valores se decrementen de uno en uno.
207
Tema 3
1. Una colisión es la asignación de una dirección a un nodo, cuando ya ha sido asignada a otro por la misma función
de Hash
2. Una función de Hash o de Mapeo, permite transformar a partir de la llave de un nodo a la dirección, en la cual se
va a almacenar
3. Las formas de resolver colisiones son las direccionamiento Abierto y Encadenamiento.
4. Es un árbol en donde: - El dato que contiene cada uno de sus nodos, no se repite.
a) El valor del dato que contiene la raíz de la rama izquierda (si es que existe), debe de tener un valor menor al de la
raíz original.
b) El dato de la rama derecha es mayor al de la raíz.
5. El recorrido Inorden
6. Comparación de llaves y transformación de llaves.
9. Cambiar de a una base numérica más pequeña, que la que esta utilizando originalmente la llave.
208
RESPUESTAS A LOS EXÁMENES DE
AUTOEVALUACIÓN 1
INFORMÁTICA III
209
ANEXO A
TEMAS COMPLEMENTARIOS DE CLASIFICACIÓN
MEZCLA
Mezcla (Intercalación)
Estos métodos mezclan o juntan dos o más grupos de elementos, pudiendo ser
estos grupos archivos (secuenciales generalmente), arreglos o simplemente
listas, las cuales deben de estar previamente clasificadas bajo el mismo criterio
ascendente ó descendentemente, no se puede dar el caso de mezclar una lista
que se encuentre en forma ascendente con otra que esté en forma
descendente, y mucho menos si están desordenadas.
Si se mezclan una lista A que tiene 10 llaves con otra lista B que tiene 15
elementos, la lista resultante C tendrá entonces 10 + 15 llaves.
210
mezclará con el de movimientos, el cual indicara que tipo de movimiento
afectará al archivo maestro1, pero como se tratan de archivos secuenciales, no
es posible realizar la operación de rewrite por lo que se generará el nuevo
archivo maestro2 que será igual al maestro1 afectado por los movimientos del
maestro2.
void mezcla(void)
{
int bandera=1;
fscanf(maestro1,"%d%s%s",®_mto1.num_cta,®_mto1.nombre,®_mto1.
salario);
if(feof(maestro1))
{
reg_mto1.num_cta=32767;
}
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
while(bandera)
{
if(reg_mov.num_cta==reg_mto1.num_cta)
/* Si se cumple esta condicion es cuando existe un registro en
el archivo
maestro1 con el mismo numero de cuenta que en el archivo de
movimientos.
*/
{
if (reg_mov.num_cta==32767) //Se trata del fin de los registros
//de los dos archivos
bandera=0;
else
211
if(reg_mov.tip_mov=='A')
/* No se dara de ALTA y se leera unicamente otro registro del
archivo de
movimientos y no se grabara nada en el archivo maestro2
(el nuevo)
*/
{
fprintf(errores,"****No se puede dar de alta el cliente ya
existe****");
fprintf(errores,"%d%s%s%c\n\n",reg_mov.num_cta,
reg_mov.nombre,reg_mov.salario,reg_mov.tip_mov);
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
}
else if(reg_mov.tip_mov=='B')
/* Este caso es cuando se dara una Baja de un registro que ya
existe y
se procedera a no grabar nada en el archivo maestro2
(nuevo) y se
se leera un registro del archivo maestro1 y otro registro
del archivo
de movimientos.
*/
{
fscanf(maestro1,"%d%s%s",®_mto1.num_cta,®_mto1.nombre,®_mto1.
salario);
if(feof(maestro1))
{
reg_mto1.num_cta=32767;
}
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
212
reg_mov.num_cta=32767;
}
}
else if(reg_mov.tip_mov=='C')
/* Se trata de un caso donde existe un registro en el archivo
Maestro1 y
se dara un cambio con el registro del archivo de
movimientos, por lo
que se grabara el registro de movimientos al archivo
maestro2 (el nuevo)
y se leera un registro del archivo de movimientos y otro
del archivo
maestro1.
*/
{
fprintf(maestro2,"%d%s%s\n",reg_mov.num_cta,reg_mov.nombre,reg_mov.sal
ario);
fscanf(maestro1,"%d%s%s",®_mto1.num_cta,®_mto1.nombre,®_mto1.
salario);
if(feof(maestro1))
{
reg_mto1.num_cta=32767;
}
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
}
}
else if(reg_mov.num_cta < reg_mto1.num_cta)
/* Se trata de un registro del archivo de movimientos, que no
esta en
en el archivo maestro1.
213
*/
{
if(reg_mov.tip_mov=='A')
/* Es una ALTA que se realizara, escribiendo el registro de
movimientos
al archivo maestro2 (nuevo)y despues se leera un registro
del archivo
de movimientos.
*/
{
fprintf(maestro2,"%d%s%s\n",reg_mov.num_cta,reg_mov.nombre,reg_mov.sal
ario);
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
}
else if (reg_mov.tip_mov=='B')
/* Es una baja que no se puede dar, ya que no existe en el
archivo
maestro1, entonces se mandara el registro de movimientos
al archivo
de errores y se leera otro registro del archivo de
movimientos
*/
{
fprintf(errores,"%d%s%s%c",reg_mov.num_cta,reg_mov.nombre,reg_mov.sala
rio,reg_mov.tip_mov);
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
214
}
else if(reg_mov.tip_mov=='C')
/* Se trata de un CAMBIO que no se puede realizar, ya que no
existe
en el archivo maestro1, se mandrara el registro de
movimientos al
de errores y se leera otro del archivo de movimientos
(igual que
en el caso anterior)
*/
{
fprintf(errores,"%d%s%s%c",reg_mov.num_cta,reg_mov.nombre,reg_mov.sala
rio,reg_mov.tip_mov);
fscanf(movimientos,"%d%s%s%c",®_mov.num_cta,®_mov.nombre,®_mo
v.salario,®_mov.tip_mov);
if(feof(movimientos))
{
reg_mov.num_cta=32767;
}
}
}
else if(reg_mov.num_cta > reg_mto1.num_cta)
/* Se trata de un registro del archivo maestro, que no esta en
el archivo
movimientos. O sea que ese registro del archivo maestro1 no
tiene
ninguna afectacion y se grabara el registro del maestro1 al
maestro2
(nuevo) y se leera otro registro del archivo maestro1.
*/
{
fprintf(maestro2,"%d%s%s\n",reg_mto1.num_cta,reg_mto1.nombre,reg_mto1 .
salario);
fscanf(maestro1,"%d%s%s",®_mto1.num_cta,®_mto1.nombre,®_mto1.
salario);
if(feof(maestro1))
{
reg_mto1.num_cta=32767;
215
}
}
}
} // fin de la funcion mezcla
216