Está en la página 1de 36

Unidad 2: Estructuras Simples

Estructuras de Datos Simples

Son estructuras de datos construidas de una o más primitivas. Las estructuras de datos
simples a considerar se construyen a partir de estructuras primitivas y son: cadenas,
arreglos y registros.

Cadenas

Una cadena es una secuencia finita de símbolos tomados de un conjunto de caracteres. El


conjunto de caracteres que se emplea para generar cadenas se llama alfabeto. Por lo
general, el inicio y final de una cadena lo delimitamos con comillas.
Las cadenas son un tipo de dato importante y se usan ampliamente. En primera instancia,
las cadenas son el medio básico para escribir programas y transmitirlos a la computadora.
Segundo, son el medio principal de intercambio de información con los usuarios. Tercero,
las cadenas se usan para almacenar información en archivos.
Al conjunto de todas las posibles cadenas que se pueden derivar de un alfabeto se le llama
vocabulario V, el cual se deriva de un alfabeto A y se denota algunas veces como V A = A .
Un alfabeto no solo contiene letras del alfabeto, también contiene cualquier símbolo
valido.
Si el alfabeto es {0,1} entonces las cadenas que se obtienen se llaman comúnmente
cadenas de bits.
Definición:
Definamos de manera más formal a S como cadena derivada de un alfabeto A por

S= ‘a 1 , a2 , … , an '

Donde cada carácter a i ε A, para 1≤i≤N.


Cada cadena tiene un atributo llamado longitud, el cual es el número de caracteres en la cadena.

Operaciones con Cadenas

Longitud: la longitud de una cadena, es el número de caracteres de la cadena.

1
Comparación: la comparación de cadena (igualdad y desigualdad) es una operación muy
importante, sobre todo en la clasificación de datos tipo carácter.

Los criterios de comparación se basan en el orden numérico del código de caracteres que admite
la computadora o el propio lenguaje de programación.

Por ejemplo: el carácter A<C ya que el código de A es 65 y el de C es 67.

Igualdad: dos cadenas de a y b de longitudes m y n son iguales si:

 El número de caracteres de a y b son los mismos (m n)


 Cada carácter de a es igual a su correspondiente de b.
Desigualdad: se realiza una comparación de caracteres correspondientes en ambas
cadenas hasta conseguir dos caracteres diferentes.
Concatenación: es la operación de reunir varias cadenas de caracteres en una sola, pero
conservando el orden de los caracteres de cada una de ellas.
Subcadenas: la operación subcadena tiene como único operando una cadena de la cual
genera una nueva cadena como resultado. Para especificar completamente la operación
de subcadena, deben especificarse no solo la cadena operando, sino también el punto de
inicio y el número de caracteres que deben tomarse para formar una nueva cadena. El
operador subcadena tiene un operando de tipo cadena, dos operandos de tipo entero, y
produce un resultado de tipo cadena.

Almacenamiento de cadenas en memoria

Como los caracteres se representan de forma individual. El almacenamiento de cadenas


de longitud N requerirá físicamente espacio adyacente para N caracteres.
Para describir la forma de almacenamiento contiguo de cadenas, es necesario indicar
donde comienza y donde termina la cadena.

Arreglos

Un arreglo es un conjunto finito ordenado de elementos homogéneos. Los elementos del


arreglo son homogéneos porque todos son del mismo tipo de dato. Un arreglo puede ser
un conjunto de elementos de tipo cadena en tanto que otro puede ser de tipo entero.
Los elementos de un arreglo a su vez pueden ser otro arreglo.

2
La forma más simple de un arreglo es el arreglo unidimensional, conocido como vector.

Propiedad de Ordenación

La propiedad de ordenación significa que es posible identificar el primero, segundo,


tercero,…, y el enésimo elemento del arreglo.

Mapeo

Se llama mapeo a  distintos métodos para encontrar de manera rápida y eficiente la


dirección de memoria donde vive un elemento determinado.

Subíndice

Los subíndices o índices de un elemento designan su posición en el arreglo. Un elemento


se define con el nombre del arreglo, seguido por el subíndice del elemento entre
corchetes, es decir, arreglo[i].
Cabe destacar que solo el arreglo en su totalidad tiene un nombre, para hacer referencia a
los elementos de un arreglo es necesario utilizar un subíndice, es decir, su posición
relativa en el arreglo.

Límite Inferior y Límite Superior

El valor mínimo permisible para el subíndice del arreglo se llama límite inferior y el valor
máximo permisible se llama límite superior.

Clasificación de arreglos

Los arreglos se pueden clasificar en:


 Arreglos Unidimensionales

3
 Arreglos Bidimensionales
 Arreglos Multidimensionales

Rango de un arreglo

El rango de un arreglo es el número de elementos de dicho arreglo.

Operaciones en Arreglos

Lectura: consiste en leer y asignar un valor a cada uno de sus componentes. Suponiendo
que se desea leer un arreglo unidimensional V. El proceso seria el siguiente:

Repetir con I desde 1 hasta 50


Leer V[I]

Al variar el valor de I, cada elemento leído se asigna al correspondiente componente del


arreglo según la posición indicada por I.
El arreglo se muestra en la siguiente figura:

Escritura: esta operación es similar a la lectura. Se debe escribir el valor de cada uno de
los componentes. Supongamos que se desea escribir los primeros N componentes del
arreglo unidimensional V en forma consecutiva. Los pasos a seguir son:

Repetir con I desde 1 hasta N


Escribir V[I]

4
Al variar el valor de I se escribe el elemento del arreglo unidimensional V, correspondiente

a la posición indicada por I.

Asignación: en general, no es posible asignar directamente un valor a todo el arreglo, sino


que se debe asignar el valor deseado a cada componente.
Actualización: la actualización es una operación que se realiza en forma frecuente en los
arreglos. La cantidad de actualizaciones está relacionada con el tipo de problema que se
intente resolver. A diferencia de las otras operaciones estudiadas, la actualización lleva
implícita otros tipos de operaciones, como inserción y eliminación de elementos.
Con el propósito de realizar una actualización de manera eficiente, es importante conocer
si el arreglo está o no ordenado: es decir, si sus componentes respetan algún orden, ya
sea creciente o decreciente.
Finalmente es importante señalar que la operación de búsqueda se utiliza como auxiliar
en las operaciones de inserción, eliminación y modificación.
Comenzaremos con el desarrollo:
Búsqueda secuencial desordenada: el algoritmo busca en forma secuencial un elemento
en un arreglo unidimensional que se encuentra desordenado. V es un arreglo de 100
elementos, N el número actual de elementos y X el valor a buscar.

Este método de búsqueda es sencillo, aunque no muy eficiente. Consiste en recorrer el


arreglo, comparando cada elemento del mismo con el valor a buscar. El proceso se repite

5
hasta que el valor se encuentre –éxito- o hasta que se haya superado el tamaño del
arreglo –fracaso-.
Arreglos desordenados: considerando un arreglo unidimensional V de 100 elementos. En
cual los primeros N componentes tienen asignado un valor.

Inserción: para insertar un elemento Y en un arreglo unidimensional V desordenado, se


debe verificar que exista espacio. Si se cumple esta condición, entonces se asignara en la
posición N+1 el nuevo elemento y se incrementara en N el total de elementos del arreglo.
Insertar Desordenado

Luego de la inserción el arreglo unidimensional V queda:

Eliminación: para eliminar un elemento X de un arreglo unidimensional V desordenado, se


debe verificar que X se encuentre en el arreglo. Si se cumple esta condición, entonces se
procederá a recorrer todos los elementos que están a su derecha una posición a la
izquierda, disminuyendo en uno el número de elementos del arreglo.
Elimina Desordenado

6
Luego de la eliminación, el arreglo unidimensional V queda:

Modificación: para modificar un elemento X de un arreglo unidimensional V desordenado


se debe verificar que X se encuentre en el arreglo. Si se cumple esta condición, entonces
se procederá a su actualización.
Modifica Desordenado

7
Luego de la modificación, el arreglo unidimensional V queda:

Arreglos Ordenados: considere el arreglo unidimensional ordenado V de 100 elementos.

Los primeros N componentes del mismo tienen asignado un valor. En este caso se trabaja
con un arreglo ordenado de manera creciente, es decir:
V[1]≤V[2]≤V[3]≤…≤V[N]
Cuando se trabaja con arreglos ordenados se debe evitar alterar el orden al insertar
nuevos elementos o al modificar los existentes.
Inserción: para insertar un elemento X en un arreglo unidimensional V ordenado, primero
se debe verificar que exista espacio. Luego se encontrará la posición en la que debería
8
estar el nuevo valor para no alterar el orden del arreglo. Cuando se detecte la posición, se
procederá a recorrer todos los elementos desde ahí hasta la N-ésima posición, un lugar a
la derecha. Finalmente se asignará el valor de X en la posición encontrada.
Antes de llevar a cabo la inserción en un arreglo ordenado, se debe realizar la búsqueda
secuencial.
Búsqueda Secuencial Ordenado

Ahora desarrollaremos como insertar para arreglos ordenados.


Insertar Ordenado

9
Luego de la inserción, el arreglo queda:

Eliminación: para eliminar un elemento X de un arreglo unidimensional ordenado V se


debe buscar la posición del elemento a eliminar. Si el resultado de la función es un valor
positivo, significa que el elemento se encuentra en el arreglo y, por tanto, se puede
eliminar; en caso contrario, no se puede realizar la operación de eliminación.
Eliminar Ordenado

10
Luego de la eliminación, el arreglo queda:

Modificación: consiste en reemplazar un componente del arreglo con otro valor. Para ello,
primero se buscara el elemento en el arreglo. Si se encuentra, antes de realizar el cambio
se debe verificar que el orden del arreglo no se altere. Si esto llegara a suceder, entonces
es necesario realizar dos operaciones; primero se debe eliminar el elemento que se quiere
modificar y luego insertar en la posición correspondiente el nuevo valor.

Representación en memoria de arreglos unidimensionales, bidimensionales y


multidimensionales

Representación de arreglo unidimensional:

11
Representación de arreglo bidimensional:
Los arreglos bidimensionales se usan para representar datos que pueden verse como una
tabla con filas y columnas. La primera dimensión del arreglo representa las columnas,
cada elemento contiene un valor y cada dimensión representa una relación
La representación en memoria se realiza de dos formas: almacenamiento por columnas o
por renglones.

12
Representación de arreglos multidimensionales: está compuesto por n dimensiones. Para
hacer referencia a cada componente del arreglo es necesario utilizar n índices, uno para
cada dimensión.
Para determinar el número de elementos en este tipo de arreglos se usan las siguientes
fórmulas:
RANGO (Ri) = lsi - (lii + 1)
No. TOTAL DE ELEMENTOS = R1 * R2* R3 * ...* Rn
Donde:
i = 1 ... n
n = No. total de dimensiones
Para determinar la dirección de memoria se usa la siguiente formula:
LOC A[i1,i2,i3,...,in] = base(A) + [(i1-li1)*R3*R4*Rn + (i2-li2)*R3*R2*... (in - lin)*Rn]*w

Matriz Esparcida

Matriz representa un término matemático que se utiliza para indicar un conjunto de


elementos organizados por medio de renglones y columnas. Es equivalente al término
arreglo bidimensional utilizado en computación. Este término se emplea en esta sección,
fundamentalmente porque a los arreglos bidimensionales poco densos se les conoce
mucho más como matrices poco densas.
13
Poco denso indica proporción muy alta de ceros entre los elementos de la matriz.
Una situación como esta exige que se haga un uso más eficiente del espacio de memoria.
Con ese propósito existen diversos métodos para almacenar solo los valores diferentes de
cero de una matriz poco densa.
Arreglo en registro: se utiliza un arreglo unidimensional, donde cada elemento representa
un registro formado por tres campos: uno para guardar el renglón donde se encontró el
valor diferente de cero; otro para guardar la columna y el tercero para guardar el valor del
elemento distinto de cero de la matriz.

Traspuesta

La traspuesta de un arreglo bidimensional se obtiene invirtiendo las posiciones del


subíndice. La traspuesta de un arreglo de M por N es un arreglo de N por M. La traspuesta
de un arreglo B es comúnmente denota por BT .

14
Por definición:

B(I,J)= BT (J , I)

Matriz tridiagonal

Se dice que una matriz es tridiagonal si los elementos distintos de cero se encuentran
localizados en la diagonal principal y en las diagonales por encima y por debajo de ésta.
Por tanto, el valor absoluto del índice i menos el índice j será menor o igual que 1.

Supongamos que se desea almacenar un arreglo unidimensional B, la matriz tridiagonal


presentada anteriormente.

Es fácil observar que el arreglo A tiene n elementos en la diagonal principal y (n-1)


elementos en las diagonales por encima y por debajo de esta. Por lo tanto, el número de
elementos de una matriz tridiagonal se calcula como:
n+2*(n-1)
Al hacer las operaciones queda:
3*n-2
Con el propósito de localizar la posición de un elemento de la matriz tridiagonal,
almacenada en un arreglo unidimensional, se requiere de una formula. En primer lugar, se
debe considerar a POSINI, que indica la posición inicial, a partir de la cual se encuentra
almacenado el arreglo –primer término de la formula-. En segundo lugar, se deben
contabilizar los elementos necesarios para llegar a un renglón i cualquiera; esto es, los

15
elementos correspondientes a los (i-1) renglones anteriores. Se calcula como la suma de
los elementos de la primera fila (2), más tres elementos por (i-2) renglones.
Por tanto, el segundo término de la fórmula es:
2+3*(i-2)
Por último, y una vez en el renglón i deseado, se deben contabilizar los elementos
correspondientes a las columnas. Con este fin se sigue el siguiente criterio.
i>j no se tiene que contabilizar ningún elemento
i=j se debe contabilizar un elemento
i<j se tienen que contabilizar dos elementos
Con lo cual se obtiene la siguiente expresión:
(j-i+1) tercer término de la formula
Observe que esta expresión contempla los tres casos enunciados. Si:
i>j, a lo sumo lo será en una unidad; por lo tanto, la expresión da cero elementos.
i=j, los mismos se anulan, quedando un elemento.
i<j. a lo sumo lo será en una unidad; por tanto, la expresión da dos elementos.
Nuevamente la suma de los tres términos da la localización del elemento i,j de la matriz
tridiagonal en un arreglo unidimensional. Por tanto:
LOC(A[i,j])=POSINI+(2+3*(i-2))+(j-i+1)
Operando queda:
LOC(A[i,j])=POSINI+2i+j-3
Así, por ejemplo, si se desea localizar la posición del elemento A[3,3], del arreglo
presentado en la matriz, en un arreglo unidimensional se hace:
LOC(A[3,3])=1+2*3+3-3=7

Implementación de polinomios en arreglos

La forma de escribir un polinomio es:

A(x)=a n x n +an −1 x n−1+ an−2 x n−2 +¿… +a 1 x+ a0

16
Donde a n ≠ 0 el grado de A es n.

Podemos representar A(x) como una lista ordenada de coeficientes, usando un arreglo
unidimensional de largo n+2.

A=(n,a n , a n−1 , … , a1 , a0 ¿

El primer elemento es el grado de A y le siguen los n+1 coeficientes en orden decreciente


del valor de los exponentes. Esta solución da una forma muy sencilla para realizar la suma
y la multiplicación de los polinomios. El valor del exponente está dado por el índice, ya
que conocemos el grado.
Sin embargo, estudiemos que desventajas tiene esta forma de representación. Sea por
ejemplo el polinomio:
1000
x +1
Este requiere para su representación. Un vector de 1002 elementos, donde 999 de ellos
son iguales a cero. Esto nos lleva a considerar otro esquema de representación.
Supongamos que tomamos el polinomio A(x) y consideramos de él, solo los coeficientes
distintos de cero. Esto nos resultara en el siguiente polinomio:
em−1
b m−1 x +b m−2 x em−2 +¿…+b 0 x e 0

Donde cada b i es un coeficiente distinto de 0 del polinomio A y los exponentes e i están en


orden decreciente, del que e m−1 >e m−2> e m−3> ¿ … >e 0

Si todos los coeficientes distintos de A son distintos de 0, luego m=n+1, e i−i y b i=ai para
0≤i≤n.

Alternativamente, si solo a 0≠0, entonces m=1, b 0=a n y e 0=n

Esto se puede representar en una lista de largo 2m+1

(m, e m−1 ,b m−1 , e m−2 , b m−2 , e m−3 , … , e 0 , b0 ¿

El primer elemento es el número de términos distintos de cero. Luego cada término tiene
dos elementos representando el par (exponente, coeficiente).

Registros

Un registro es una colección finita y ordenada de elementos, posiblemente heterogéneos,


que se tratan como una unidad. Un registro se distingue de un arreglo en el hecho de que
todos los elementos de un arreglo deben tener la misma estructura, a diferencia de los
elementos componentes del registro que pueden tener diferentes estructuras de datos.

17
Los elementos de un registro son comúnmente llamados campos. Los campos de un
registro pueden ser todos de diferentes tipos de datos, por lo tanto también podrán ser
registros o arreglos. Cada campo se identifica con un nombre único, el identificador de
campo. Otra diferencia importante con los arreglos que no es necesario establecer un
orden entre los campos.

Diferencias entre registros y arreglos

1) Un arreglo puede almacenar N elementos del mismo tipo –estructura de datos


homogénea-, mientras que un registro puede almacenar N elementos de
diferentes tipos de datos –estructura de datos heterogénea-.
2) A los componentes de un arreglo se tiene acceso por medio de índices que indican
la posición del elemento correspondiente en el arreglo, mientras que a los
componentes de un registro, los campos, se tiene acceso por medio de su nombre,
que es único.

Llaves de Identificación

Un registro, por lo general, contiene un campo que lo identifica. El campo que identifica
un registro se llama campo llave.
La llave de un registro puede ser un elemento básico o bien uno grupal. Por ejemplo, un
registro de la clase particular CURSO puede identificarse por el valor de sus campos
DEPARTAMENTO, NUMERO Y SECCION.

Archivos

Se llama archivo a una colección de ocurrencias de registros lógicamente relacionados que


se tratan como una unidad. Es usual que todos los registros del archivo sean de un solo
formato. Sin embargo, algunas veces hay diversas formas de registros en un solo archivo.
Por ejemplo, una ocurrencia del registro EMPLEADO podría ser seguida por varias
ocurrencias de registros del tipo RESPONSABILIDAD-DEL-PROYECTO, detallando cada una
de las acciones ejercidas por el empleado en algún proyecto en particular.

18
Las operaciones legales sobre registros son aquellas que se definen a partir del contenido
de los campos, basadas en sus estructuras de datos.

Representación en memoria de registros

Los registros se almacenan casi siempre en forma lineal. La memoria se reserva para cada
uno de los elementos básicos en el registro, ordenados en forma contigua, tal y como
aparecen en la declaración.
Esta técnica de almacenamiento lineal con frecuencia ocasiona que los elementos de
datos se empiecen fuera de los límites de la palabra. En algunas máquinas, cierto tipo de
límites: de media palabra, de palabra completa o de doble palabra. Para asegurarse del
alineamiento correcto en estos casos puede ser necesario que el programador inserte
espacios sin información significativa entre los elementos de datos. Este espacio de
relleno es llamado bytes inactivos o relleno.

Acceso Secuencial y Aleatorio

Los archivos de acceso aleatorio son más versátiles, permiten acceder a cualquier parte del
registro en cualquier momento, como si fueran arrays en memoria. Las operaciones de
lectura y/o escritura pueden hacerse en cualquier punto del archivo.
Los archivos de acceso secuencial se basan en el hecho de que, para acceder a una
determinada posición de los mismos, hemos de recorrer desde el principio todas las
posiciones hasta llegar a la deseada. Las impresoras son un claro ejemplo de acceso
secuencial, así como las cintas magnéticas.

Organizaciones de Archivos

La técnica utilizada para representar y almacenar registros en archivos es llamada


organización de archivos. Las cuatro técnicas fundamentales de organización de archivos
son:
1) Secuencial
2) Relativa
3) Secuencial indexado
4) Multi-llave

19
Primero la organización determina la secuenciación de los registros del archivo, la cual es
la ordenación física de los registros almacenados.
Segundo, la organización del archivo determina el conjunto de operaciones necesarias
para encontrar registros en particular. Los registros individuales son identificados
normalmente mediante valores particulares en los campos de la llave de búsqueda. Este
campo de datos puede o no tener valores duplicados en el archivo y el campo puede ser
un elemento básico o de grupo.
La organización más apropiada para un archivo en particular está determinada por las
características operacionales del medio de almacenamiento utilizado y por la naturaleza
de las operaciones a ejecutar sobre los datos. La característica más importante de un
dispositivo de almacenamiento, que influye en la elección de la técnica de organización de
archivo es, si el archivo permite acceso directo a los registros en particular sin tener que
accesar todos los registros anteriores almacenados en el dispositivo, o si permite
únicamente acceso secuencial a los registros.

Recursividad

La recursividad o recursión es un concepto amplio, con muchas variantes, y difícil de


precisar con pocas palabras. Aparece en numerosas actividades de la vida diaria; por
ejemplo, en una fotografía donde se observa otra fotografía.
La recursión es un recurso muy poderoso que permite expresar soluciones simples y
naturales a ciertos tipos de problemas. Es importante considerar que no todos los
problemas son naturalmente recursivos; algunos sí lo son y otros no.
Los arboles por ejemplo, representan las estructuras de datos, no lineales y dinámicas,
más eficientes que existen actualmente en computación. La característica de los árboles
es que son estructuras inherentemente recursivas. Es decir, en cualquier actividad de
programación que se realice con árboles se utiliza la recursividad.
La recursión se puede presentar de dos maneras diferentes:
 Directa: el programa o subprograma se llama directamente a sí mismo.
 Indirecta: el subprograma llama a otro subprograma y este en algún momento
llama nuevamente al primero.
En toda definición recursiva de un problema siempre se deben establecer dos pasos
diferentes y muy importantes: el paso básico y el paso recursivo. El primero, uno o varios,
dependiendo del problema, se utiliza como condición de parada o fin de la recursividad. A

20
éste llegamos cuando encontramos la solución del problema o cuando decidimos que ya
no vamos a seguir, porque no están dadas las condiciones para hacerlo.
El paso segundo, por otra parte, propicia la recursividad. Se pueden presentar uno o varios
nuevamente dependiendo del problema a resolver.
Cuando se analiza la solución de recursiva de un problema es importante determina con
precisión cuáles serás los pasos básico y recursivo.

Abstracciones con procedimientos y funciones

En general, una abstracción es un cálculo (asociado a un nombre) que puede ser utilizado
en distintas partes de un programa.
Se llama abstracción porque el programador puede usarla abstrayéndose de cómo se lleva a
cabo el cálculo, y centrándose en qué efectos tiene.
Ventajas de las abstracciones:
 Mejorar la legibilidad: permite programas más cortos, más simples.
 Mejorar la facilidad de escritura: permite trasladar más fácilmente los diseños a
código.
 Permitir o facilitar la reusabilidad.
 Particionar los programas, disminuyendo la cohesión.
 Facilitar el trabajo en equipo.
Las abstracciones se pueden clasificar en base al tipo de cálculo asociado, aquí veremos
estos dos tipos:
 Abstracciones procedurales (procedimientos): el cálculo es la ejecución de una
determinada sentencia. Constituyen abstracciones sobre sentencias.
 Abstracciones funcionales (funciones): el cálculo es la evaluación de una
determinada expresión. Constituyen abstracciones sobre expresiones.

Pasaje de Parámetros

Los módulos de un programa (o funciones, en C) se comunican entre sí por medio de los


datos que son pasados como parámetros en la invocación y los datos que son devueltos
como resultado de las invocaciones.

21
Un módulo, generalmente, realizará alguna tarea empleando datos que le son provistos.
Hay distintas maneras de proveerle los datos que el módulo necesita durante su ejecución.
Una de las formas más usuales es a través del uso de parámetros. Estos parámetros son
declarados en la definición del módulo, en donde se dice cuántos y de qué tipo son los datos
que el módulo espera cuando el mismo sea invocado, así como con qué nombres se puede
referenciar esos datos dentro del módulo. Estamos hablando de variables que tomarán un
valor cuando el módulo sea invocado. Estas variables se conocen como parámetros
formales.
Al invocarse un módulo, habrá que darle o pasarle los valores reales con los que este
trabajará: uno por cada parámetro declarado en la definición del mismo. Estos valores los
tomarán los parámetros formales. En la invocación del módulo estos valores se conocen
como parámetros reales o actuales. Se habla así de pasarle, al módulo, los parámetros
reales, es decir los datos concretos que el módulo deberá procesar

Búsqueda y Ordenamiento

La búsqueda es una operación que se utiliza básicamente para recuperar datos que se habían
almacenado con anticipación. El resultado puede ser de éxito si se encuentra la información
deseada, o de fracaso, en caso contrario.
Esta operación se puede llevar a cabo sobre elementos ordenados o desordenados. Cabe
destacar que la búsqueda es más fácil y ocupa menos tiempo cuando los datos se
encuentran ordenados.
Los métodos de búsqueda se pueden clasificar en internos y externos, según la ubicación
de los datos sobre los cuales se realizará la búsqueda. Se denomina búsqueda interna
cuando todos los elementos se encuentran en la memoria principal de la computadora; por
ejemplo, almacenados en arreglos, listas ligadas o árboles. Es búsqueda externa si los
elementos están en memoria secundaria; es decir, si hubiera archivos en dispositivos como
cintas o discos.
La búsqueda interna trabaja con elementos que se encuentran almacenados en la memoria
principal de la máquina. Éstos pueden estar en estructuras estáticas –arreglos- o dinámicas
–listas ligadas y árboles-. Los métodos de búsqueda interna más importantes son:
 Secuencial o lineal
 Binaria
 Por transformación de claves
 Árboles de búsqueda

22
Ordenar significa reagrupar o reorganizar un conjunto de datos u objetos en una
secuencia específica.
Formalmente se define ordenación de la siguiente manera:
Sea A una lista de N elementos:
A1 , A 2, A3 ,…, A N

Ordenar significa permutar estos elementos de tal forma que queden de acuerdo con una
distribución preestablecida.

Ascendente: A1≤ A2 ≤ A 3 ≤ …≤ A N

Descendente: A1≥ A2 ≥ A 3 ≥ …≥ A N

Argumentos

Son las condiciones a buscar al momento de realizar la búsqueda.


En el caso de ordenamiento el argumento será, la condición para la forma en la que se
quiere ordenar los elementos.

Resultados

Una búsqueda puede dar un resultado de éxito si se encuentra el elemento buscado o de


fracaso en caso contrario.

Búsqueda Secuencial

La búsqueda secuencial consiste en revisar elemento tras elemento hasta encontrar el


dato buscado, o llegar al final del conjunto de datos disponibles.
En el caso de búsquedas secuenciales en arreglos, primero se debe distinguir entre
arreglos ordenados y desordenados.
Esta búsqueda consiste, básicamente, en recorrer el arreglo de izquierda a derecha hasta
que se encuentre el elemento buscado o se termine el arreglo, lo que ocurra primero.
Búsqueda Secuencial en Arreglos Desordenados

23
Son dos los posibles resultados que se pueden obtener al aplicar este algoritmo: la
posición en la que encontró el elemento, o un mensaje de fracaso si el elemento no se
halla en el arreglo. Si hubiera dos o más ocurrencias del mismo valor, se encuentra la
primera de ellas.
La búsqueda secuencial en arreglos ordenados es similar al caso anterior. Sin embargo, el
orden entre los elementos del arreglo permite incluir una nueva condición que hace más
eficiente al proceso.
Búsqueda Secuencial en Arreglos Ordenados

24
Como el arreglo está ordenado, se establece una nueva condición: el elemento buscado
tiene que ser mayor que el del arreglo. Cuando el ciclo se interrumpe, se evalúa cuál de las
condiciones es falsa. Si (I>N) o si se comparó el elemento con un valor mayor a sí mismo
(X<V[I]), se está ante un caso de fracaso: el elemento no está en el arreglo. Si X=V[I]
entonces se encontró al elemento en el arreglo.

Mejor y Peor Caso de Búsqueda Secuencial

El número de comparaciones es uno de los factores más importantes que se utilizan para
determinar la complejidad de los métodos de búsqueda. Para analizar la complejidad de la
búsqueda secuencial, se deben establecer los casos más favorable o desfavorable que se
presenten.
Al buscar, por ejemplo, un elemento en un arreglo unidimensional desordenado de N
componentes, puede suceder que ese valor no se encuentre; por lo tanto se harán N
comparaciones al recorrer todo el arreglo. Por otra parte, si elemento se encuentra en el
arreglo, éste puede estar en la primera posición, en la última, se harán N comparaciones;
y si se encuentran en la posición i(1<i<N), entonces se realizarán i comparaciones.
El número de comparaciones que se llevan a cabo si trabajamos con arreglos ordenados
será el mismo que para desordenados, siempre y cuando el elemento se encuentre en el
arreglo. Si este no fuera el caso, entonces el número de comparaciones disminuiría

25
sensiblemente en arreglos ordenados, siempre que el valor buscado esté comprendido
entre el primero y el último elemento del arreglo.
Por otra parte, el número de comparaciones en la búsqueda secuencial en listas
simplemente ligadas es el mismo que para arreglos.
Los números mínimo, mediano y máximo de comparaciones que se ejecutan cuando se
trabaja con la búsqueda secuencial son:

Búsqueda Binaria

La búsqueda binaria consiste en dividir el intervalo de búsqueda en dos partes,


comparando el elemento buscado con el que ocupa la posición central en el arreglo. Para
el caso de que no fueran iguales se redefinen los extremos del intervalo, según el
elemento central sea mayor o menor que el elemento buscando, disminuyendo de esta
forma el espacio de búsqueda. El proceso concluye cuando el elemento es encontrado, o
cuando el intervalo de búsqueda se anula, es vacío.
El método de búsqueda binaria funciona exclusivamente con arreglos ordenados.
No se puede utilizar con listas simplemente ligadas –no podríamos retroceder para
establecer intervalos de búsqueda- ni con arreglos desordenados. Con cada iteración del
método el espacio de búsqueda se reduce a la mitad, por lo tanto, el número de
comparaciones a realizar disminuye notablemente. Esta disminución resulta significativa
cuanto más grande sea el tamaño del arreglo.

26
Ordenamiento Interno y Ordenamiento Externo

En el procesamiento de datos a los métodos de ordenación se les clasifica en dos grandes


categorías, según donde hayan sido almacenados:
 Ordenación de arreglos
 Ordenación de archivos
La primera categoría se denomina también ordenación interna, ya que los elementos o
componentes del arreglo se encuentran en la memoria principal de la computadora.
La segunda categoría se llama ordenación externa, ya que los elementos se encuentran en
archivos almacenados en dispositivos de almacenamiento secundario, como discos.
Los siguientes métodos que se explicaran, son métodos de ordenación interna.

27
Los métodos de ordenación externa que podemos destacar son: intercalación de archivos,
ordenación de archivos, ordenación por mezcla directa y ordenación por el método de
mezcla equilibrada.

Ordenamiento por Selección


Cabe destacar, que cuando indicamos “llave”, es lo mismo que decir “una llave y su
respectivo registro” o “una llave y el apuntador a su correspondiente registro”.
La idea básica de un ordenamiento por selección es la selección repetida de la llave menor
restante en una lista de datos no clasificados, como la siguiente llave, en una lista de datos
ordenada que crece.

La totalidad de la lista de llaves no ordenadas, debe estar disponible, para que nosotros
podamos seleccionar la llave con valor mínimo en esa lista.
Por ejemplo, considere la siguiente lista de llaves no ordenadas:

El primer paso de selección identifica el 2 como el valor mínimo, lo saca de dicha lista y lo
agrega como primer elemento en una nueva lista ordenada.

El segundo paso identifica el 3 como el siguiente elemento mínimo y lo retira de la lista


para incluirlo en la nueva lista de elementos ordenados.

Y así hasta que la lista quede ordenada.


Para una lista de n registros, este algoritmo requiere n pases sobre la lista no ordenada.

28
En el i-ésimo pase, se habrán hecho n-i comparaciones de llaves.

Ordenamiento por Selección con Intercambio

El método anterior requiere dos veces más espacio del necesario. Una modificación al
método directo de ordenación por selección es el ordenamiento por selección con
intercambio, en el cual es valor de la llave seleccionada es movido a su posición final por
intercambio con la llave que inicialmente ocupaba esa posición. Considerando otra vez la
lista no clasificada:

Después del primer paso, 2 es seleccionado,

Después del segundo paso, 3 es seleccionado,

Y así sucesivamente hasta que la lista queda ordenada.

29
Ordenamiento por Inserción

La idea básica de ordenar por inserción es tomar la siguiente llave de una lista no
clasificada e insertarla en su posición relativa correspondiente a una lista creciente de
datos clasificados.

La lista completa de las llaves ordenadas deberá estar disponible, a lo largo del proceso,
para poder insertar una llave en su posición relativa apropiada. La lista puede alimentarse
durante el proceso.
Considerando el ejemplo anterior:

En el primer paso se considera a la primera llave, la cual es 14, y el resultado es:

Después del segundo paso:

Y así sucesivamente hasta que la lista queda ordenada.

Comparaciones de los Métodos

30
Comparando los métodos podemos deducir que el ordenamiento por selección con
intercambio tiene esencialmente los mismos requerimientos de comparación que el
ordenamiento por selección directa.
Comparando al método de inserción con el método por selección podemos deducir que
ambas técnicas poseen la misma cantidad de comparaciones al momento de realizar la
ordenación.
La ventaja de emplear estos métodos es que son relativamente fáciles de comprender y
programar, pero son técnicas relativamente pobres y que emplean muchas
comparaciones para llevar a cabo el ordenamiento.

Cabe destacar que estos métodos requieren O( N 2 ¿

Ordenamiento por Intercambio: Método Burbuja

Este método puede trabajar de dos maneras diferentes: llevando los elementos más
pequeños hacia la parte izquierda del arreglo o trasladando los elementos más grandes
hacia su parte derecha. La idea básica de este algoritmo consiste en comparar pares de
elementos adyacentes e intercambiarlos entre si hasta que todos se encuentren
ordenados. Se realizan (n-1) pasadas transportando en cada una de ellas el menor o
mayor de los elementos –según sea el caso- a su posición ideal. Al final de las (n-1)
pasadas los elementos del arreglo estarán ordenados.
Supongamos que se desea ordenar las siguientes claves del arreglo unidimensional A
transportando en cada pasada el menor elemento hacia la parte izquierda del arreglo.
A: 15 67 08 16 44 27 12 35
Las comparaciones que se realizan son:

Luego de la primera pasada el arreglo queda así:

31
A: 08 15 67 12 16 44 27 35
Se puede observar que el elemento más pequeño, en este caso 08, fue situado en la parte
izquierda del arreglo.

Luego de la segunda pasada el arreglo queda así:


A: 08 12 15 67 16 27 44 35
El segundo elemento más pequeño del arreglo, en este caso 12, fue situado en la segunda
posición.
En la siguiente tabla se muestra el resultado de las siguientes pasadas:

Burbuja Menor

32
Ordenación por el método quicksort

El método quicksort es actualmente el más eficiente y veloz de los métodos de ordenación


interna. Este método consiste en:
1) Se toma un elemento X de una posición cualquiera del arreglo.
2) Se trata de ubicar a X en la posición correcta del arreglo, de tal forma que todos los
elementos que se encuentren a su izquierda sean menores o iguales a X y a todos
los que se encuentren a su derecha sean mayores o iguales a X.
3) Se repiten los pasos anteriores, pero ahora para los conjuntos de datos que se
encuentran a la izquierda y a la derecha de la posición de X en el arreglo.
4) El proceso termina cuando todos los elementos se encuentran en su posición
correcta en el arreglo.
Se debe seleccionar, entonces, un elemento X cualquiera. En este caso se seleccionara
A[1]. Se empieza a recorrer el arreglo de derecha a izquierda comparando si los elementos
son mayores o iguales a X. Si un elemento no cumple con esta condición, se intercambian
aquellos y se almacenan en una variable la posición del elemento intercambiado –se acota
el arreglo por la derecha-. Se inicia nuevamente el recorrido pero ahora de izquierda a
derecha, comparando si los elementos son menores o iguales a X.
Si un elemento no cumple con esta condición, entonces se intercambian aquellos y se
almacenan en otra variable la posición del elemento intercambiado –se acota el arreglo
por la izquierda-. Se repiten los pasos anteriores hasta que el elemento X encuentra su
posición correcta en el arreglo.
Al utilizar la iteratividad, se deben almacenar en las pilas los índices de los dos conjuntos
de datos que falta tratar. Su utilizaran dos pilas, PILAMENOR y PILAMAYOR.

33
En la primera se almacenara el extremo izquierdo y en la otra se almacenara el extremo
derecho de los conjuntos de datos que falta tratar.
Los índices del primer conjunto quedaron almacenados en la primera posición de
PILAMENOR y PILAMAYOR, respectivamente. La posición del extremo izquierdo del primer
conjunto (1) en PILAMENOR y la del extremo derecho del mismo conjunto (2) en
PILAMAYOR. Las posiciones de los extremos izquierdos y derecho del segundo conjunto (4
y 8) fueron almacenados en la cima de PILAMEJOR y PILAMAYOR respectivamente.

Y el algoritmo para ordenar será:

Este algoritmo a su vez necesita de otro algoritmo, que es:

34
Objetivos, comparaciones y rendimiento

El método quicksort es el más rápido de ordenación interna que existe en la actualidad.


Diversos estudios realizados sobre su comportamiento demuestran que si se escoge en
cada pasada el elemento que ocupa la posición central del conjunto de datos a analizar, el
número de pasadas necesarias para ordenarlo es del orden log n. Respecto del número de
comparaciones, si el tamaño del arreglo es una potencia de 2, en la primera pasada
realizara (n-1) comparaciones, en la segunda (n-1)/2 comparaciones, pero en dos
conjuntos diferentes y así sucesivamente. Por lo tanto:

35
Si se considera a cada uno de los componentes de la sumatoria como un término y el
número de términos de la sumatoria es igual a m, entonces se tiene que:

Considerando que el número de términos de la sumatoria (m) es igual al número de


pasadas, y que este es igual a log n, la expresión anterior queda:

Sin embargo, encontrar el elemento que ocupe la posición central del conjunto de datos
que se van a analizar es una tarea difícil, ya que existen 1/n posibilidades de lograrlo.
Además, el rendimiento medio del método es aproximadamente (2*ln2) inferior al caso
optimo, por lo que Hoare, el autor del método, propone como solución que el elemento X
se seleccione arbitrariamente o bien entre una muestra relativamente pequeña de
elementos del arreglo.
El peor caso ocurre cuando los elementos del arreglo ya que se encuentran ordenados o
bien cuando se encuentran en orden inverno.

36

También podría gustarte