2. Algoritmo de búsqueda
Un algoritmo de búsqueda es aquel que está diseñado para localizar un
elemento con ciertas propiedades dentro de una estructura de datos; por
ejemplo, ubicar el registro correspondiente a cierta persona en una base
de datos, o el mejor movimiento en una partida de ajedrez.
La variante más simple del problema es la búsqueda de un número en un
vector.
Búsqueda dicotómica
Elementos necesarios en una búsqueda :
log2(n) donde n = elementos de la búsqueda
Ejemplo: log2(1.000.000) ≈ 20
3. Búsqueda secuencial.
Se utiliza cuando el vector no está ordenado o no puede ser ordenado
previamente. Consiste en buscar el elemento comparándolo
secuencialmente (de ahí su nombre) con cada elemento del arreglo hasta
encontrarlo, o hasta que se llegue al final. La existencia se puede asegurar
cuando el elemento es localizado, pero no podemos asegurar la no
existencia hasta no haber analizado todos los elementos del arreglo. A
continuación se muestra el pseudocódigo del algoritmo:
4.
5. Búsqueda dicotómica (binaria).
Se utiliza cuando el vector en el que queremos determinar la existencia de un elemento
está previamente ordenado. Este algoritmo reduce el tiempo de búsqueda
considerablemente, ya que disminuye exponencialmente el número de iteraciones
necesarias.
Está altamente recomendado para buscar en arrays de gran tamaño. Por ejemplo, en uno
conteniendo 50.000.000 elementos, realiza como máximo 26 comparaciones (en el peor
de los casos).
Para implementar este algoritmo se compara el elemento a buscar con un elemento
cualquiera del array (normalmente el elemento central): si el valor de éste es mayor que
el del elemento buscado se repite el procedimiento en la parte del array que va desde el
inicio de éste hasta el elemento tomado, en caso contrario se toma la parte del array que
va desde el elemento tomado hasta el final. De esta manera obtenemos intervalos cada
vez más pequeños, hasta que se obtenga un intervalo indivisible. Si el elemento no se
encuentra dentro de este último entonces se deduce que el elemento buscado no se
encuentra en todo el array.
A continuación se presenta el pseudocódigo del algoritmo, tomando como elemento
inicial el elemento central del array.
10. En programación, una matriz o vector (llamados en inglés arrays) es una zona de
almacenamiento continuo, que contiene una serie de elementos del mismo tipo, los
elementos de la matriz. Desde el punto de vista lógico una matriz se puede ver como un
conjunto de elementos ordenados en fila (o filas y columnas si tuviera dos
dimensiones).
En principio, se puede considerar que todas las matrices son de una dimensión, la
dimensión principal, pero los elementos de dicha fila pueden ser a su vez matrices (un
proceso que puede ser recursivo), lo que nos permite hablar de la existencia de
matrices multidimensionales, aunque las más fáciles de imaginar son los de una, dos y
tres dimensiones.
Estas estructuras de datos son adecuadas para situaciones en las que el acceso a los
datos se realice de forma aleatoria e impredecible. Por el contrario, si los elementos
pueden estar ordenados y se va a utilizar acceso secuencial sería más adecuado utilizar
una lista, ya que esta estructura puede cambiar de tamaño fácilmente durante la
ejecución de un programa.
11. Índices.
Todo vector se compone de un determinado número de elementos. Cada
elemento es referenciado por la posición que ocupa dentro del vector. Dichas
posiciones son llamadas índice y siempre son correlativos. Existen tres formas
de indexar los elementos de una matriz:
• Indexación base-cero (0): En este modo el primer elemento del vector será
la componente cero ('0') del mismo, es decir, tendrá el índice '0'. En
consecuencia, si el vector tiene 'n' componentes la última tendrá como
índice el valor 'n-1'. El lenguaje C es un ejemplo típico que utiliza este
modo de indexación.
• Indexación base-uno (1): En esta forma de indexación, el primer elemento
de la matriz tiene el índice '1' y el último tiene el índice 'n' (para una
matriz de 'n' componentes).
• Indexación base-n (n): Este es un modo versátil de indexación en la que el
índice del primer elemento puede ser elegido libremente, en algunos
lenguajes de programación se permite que los índices puedan ser
negativos e incluso de cualquier tipo escalar (también cadenas de
caracteres).
12. Notación.
La representación de un elemento en un vector se suele hacer mediante el
identificador del vector seguido del índice entre corchetes, paréntesis o llaves:
Aunque muchas veces en pseudocódigo y en libros de matemática se
representan como letras acompañadas de un subíndice numérico que indica
la posición a la que se quiere acceder. Por ejemplo, para un vector "A":
13. Forma de acceso:
La forma de acceder a los elementos de la matriz es directa; esto significa
que el elemento deseado es obtenido a partir de su índice y no hay que ir
buscándolo elemento por elemento (en contraposición, en el caso de una
lista, para llegar, por ejemplo, al tercer elemento hay que acceder a los dos
anteriores o almacenar un apuntador o puntero que permita acceder de
manera rápida a ese elemento).
Para trabajar con vectores muchas veces es preciso recorrerlos. Esto se
realiza por medio de bucles. El siguiente pseudocódigo muestra un
algoritmo típico para recorrer un vector y aplicar una función a
cada una de las componentes del vector:
14. Vectores dinámicos y estáticos.
Lo habitual es que un vector tenga una cantidad fija de memoria asignada,
aunque dependiendo del tipo de vector y del lenguaje de programación un
vector podría tener una cantidad variable de datos. En este caso, se les
denomina vectores dinámicos, en oposición, a los vectores con una cantidad
fija de memoria asignada se los denomina vectores estáticos.
El uso de vectores dinámicos requiere realizar una apropiada gestión de
memoria dinámica. Un uso incorrecto de los vectores dinámicos, o mejor
dicho, una mala gestión de la memoria dinámica, puede conducir a una fuga
de memoria. Al utilizar vectores dinámicos siempre habrá que liberar la
memoria utilizada cuando ésta ya no se vaya a seguir utilizando.
Lenguajes más modernos y de más alto nivel, cuentan con un mecanismo
denominado recolector de basura (como es el caso de Java) que permiten
que el programa decida si debe liberar el espacio basándose en si se va a
utilizar en el futuro o no un determinado objeto.
16. Comienzo del vector
(vector (0), primer
elemento)
((indice * sizeof (int)
cantidad de bytes de
desplazamiento desde la
base.)
17. El ejemplo anterior está hecho para el lenguaje C++. En C, para crear
vectores dinámicos se tendrían que utilizar las instrucciones malloc y realloc
para reservar memoria de forma dinámica (ver biblioteca stdlib.h), y la
función free para liberar la memoria utilizada.
18. Vectores multidimensionales.
En Basic, Java y otros lenguajes es posible
declarar matrices multidimensionales,
entendiéndolas como un vector de x
dimensión. En dichos casos en número de
elementos del vector es el producto resultante
de cada dimensión.
Por ejemplo el vector v(4,1) tiene 10
elementos se calcula del siguiente modo: (0-4)
* (0-1). Los elementos de la primera
dimensión del vector contiene 5 elementos
que van del '0' al '4' y la 2º dimensión tiene 2
elementos que van desde '0' a '1'. Los
elementos serían accedidos del siguiente
modo: