Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Extensión – Guacara
Unidad 5:
Estructuras estáticas de estados
Ing. En sistemas
6 to Semestre
En programación, se le denomina vector, formación, matriz (en inglés array, del cual surge
la mala traducción arreglo), a una zona de almacenamiento contiguo 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 las 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,
siendo esta última una estructura dinámica (al no tener un tamaño definido).
Índices
Todo vector se compone de un determinado número de elementos, lo cual lo hace que sea
una estructura estática. Cada elemento es referenciado por la posición que ocupa dentro del
vector. Dichas posiciones son llamadas índice y siempre son correlativas. 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, el último elemento tendrá como índice el valor 'n-1'. El lenguaje C y el
lenguaje Java son un ejemplo típico que utiliza este modo de indexación, ya que en
aritmética de punteros el valor 0 corresponde a un desplazamiento nulo del puntero. De este
modo, al sumar el valor del puntero y del desplazamiento 0 se consigue apuntar al primer
elemento del vector.
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). Lua es un
ejemplo de lenguaje que usa este tipo de indexación.
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).
Arreglo
Un arreglo puede definirse como un grupo o una colección finita, homogénea y ordenada de
elementos. Los arreglos pueden ser de los siguientes tipos:
● De una dimensión.
● De dos dimensiones.
● De tres o más dimensiones.
Tipos de arreglos
● Arreglos unidimensionales.
● Arreglos multidimensionales.
● Arreglo con múltiples subíndices.
● Arreglos unidimensionales
Es un tipo de datos estructurado que está formado de una colección finita y ordenada de
datos del mismo tipo. Es la estructura natural para modelar listas de elementos iguales.
Están formados por un conjunto de elementos de un mismo tipo de datos que se almacenan
bajo un mismo nombre, y se diferencian por la posición que tiene cada elemento dentro del
arreglo de datos. Al declarar un arreglo, se debe inicializar sus elementos antes de
utilizarlos. Para declarar un arreglo tiene que indicar su tipo, un nombre único y la cantidad
de elementos que va a contener.
Arreglos multidimensionales
Es un tipo de dato estructurado, que está compuesto por dimensiones. Para hacer
referencia a cada componente del arreglo es necesario utilizar n índices, uno para cada
dimensión. El término dimensión representa el número de índices utilizados para referirse a
un elemento particular en el arreglo. Los arreglos de más de una dimensión se llaman
arreglos multidimensionales.
Ordenaciones en Arreglos
Selección directa
Este método consiste en seleccionar el elemento más pequeño de nuestra lista para
colocarlo al inicio y así excluirlo de la lista. Para ahorrar espacio, siempre que vayamos a
colocar un elemento en su posición correcta lo intercambiaremos por aquel que la esté
ocupando en ese momento.
Este algoritmo consiste en partir el arreglo por la mitad, ordenar la mitad izquierda, ordenar
la mitad derecha y mezclar las dos mitades ordenadas en un array ordenado. Este último
paso consiste en ir comparando pares sucesivos de elementos (uno de cada mitad) y
poniendo el valor más pequeño en el siguiente hueco.
Búsqueda secuencial: A este método también se le conoce como búsqueda lineal y consiste
en empezar al inicio del conjunto de elementos , e ir a través de ellos hasta encontrar el
elemento indicado ó hasta llegar al final del arreglo. Este es el método de búsqueda más
lento, pero si nuestro arreglo se encuentra completamente desordenado es el único que nos
podrá ayudar a encontrar el dato que buscamos.
Búsqueda binaria: Las condiciones que debe cumplir el arreglo para poder usar búsqueda
binaria son que el arreglo este ordenado y que se conozca el número de elementos. Este
método consiste en lo siguiente: comparar el elemento buscado con el elemento situado en
la mitad del arreglo, si tenemos suerte y los dos valores coinciden, en ese momento la
búsqueda termina. Pero como existe un alto porcentaje de que esto no ocurra, repetiremos
los pasos anteriores en la mitad inferior del arreglo si el elemento que buscamos resultó
menor que el de la mitad del arreglo, o en la mitad superior si el elemento buscado fue
mayor. La búsqueda termina cuando encontramos el elemento o cuando el tamaño del
arreglo a examinar sea cero.
Búsqueda por hash: La idea principal de este método consiste en aplicar una función que
traduce el valor del elemento buscado en un rango de direcciones relativas. Una desventaja
importante de este método es que puede ocasionar colisiones.
Notación
Accediendo a su índice podemos acceder a cada elemento del arreglo, conociendo que el
primer elemento tiene índice 0. En muchas ocasiones para buscar un elemento que
desconocemos su índice debemos hacer uso de bucles.
Ejemplo en Javascript
Almacenamiento
● Arrays (vectores): Es la forma más eficiente de almacenar objetos pero una vez
defines el tamaño del vector no puedes ampliarlo o reducirlo. Además no puedes
guardar variables de distinto tipo
● List: Almacena las variables en el orden en que se insertan. Nos permite tener
valores duplicados en la lista. Nos permite tener variables de distinto tipo (al
declararla no pondremos <Tipo> como en nuestro ejemplo)
● Map: No almacena el orden en que se insertan los datos (algunas de sus
implementaciones si lo hacen). Para almacenar los datos se hacen usando el par
clave-valor. No permite valores de clave repetidos pero sí valores de valor repetidos.
Nos permite tener variables de distinto tipo.
● Set: No almacena el orden en que se insertan los datos (algunas de sus
implementaciones si lo hacen). No permite valores duplicados. Nos permite tener
variables de distinto tipo. Es lo que debemos elegir si no queremos tener elementos
repetidos en nuestra estructura de datos.
ejemplo
Algoritmos de Busqueda y Ordenacion
Algoritmos de ordenación
de simplificar asumimos que los arrays contienen solo enteros aunque obviamente
estructuras más complicadas son posibles. Asumimos también que el ordenamiento
completo se puede realizar en memoria principal o sea la cantidad de elementos es
relativamente pequeño (menos de un millón).
Los algoritmos que describiremos reciben como argumentos un array que pasa los
elementos y un entero que representa la cantidad de elementos. Asumiremos que N (el
número de elementos) es un número legal. Para alguno de los programas que veremos será
conveniente utilizar un centinela en posición 0, por lo cual nuestros array irán del 0 al N. Los
datos irán del 1 al N.
Ordenamiento Burbuja
int i,j,temp;
for(i=0;i<n-1;i++)
for(j=0;j<n-1;j++)
if (a[j]>a[j+1])
intercambio(&a[j],&a[j+1]);
int aux;
aux=*a;
*a = *b;
*b=aux;
En cada ejecución del for interno (en el que varía j) se coloca el elemento mayor en su
lugar. Realizó esta repetición tantas veces como elementos.
Ordenamiento por inserción (Insertion Sort)
es el siguiente:
int j,P,tmp;
A[0]=Min int;
for(P=2;P<=N;P++)
j=P;
tmp=A[P];
A[j] = A[j-1];
j-=1;
A[j]=tmp;
El programa es el siguiente:
for(i=1;i<N;i++)
sel=i;
clave sel=A[i];
for(j=i+1;j<=N;j++)
if (A[j]<clave sel)
{ clave sel=A[j];
sel=j;
intercambio(A[i],A[sel]);
}
Algoritmos de Búsqueda
Búsqueda lineal
La búsqueda lineal compara los elementos del array con la clave de búsqueda hasta que
encuentra el elemento o bien hasta que se determina que no se encuentra.
for(int i=0;i<n;i++)
if (A[i]==clave) return i;
return -1;
Este método funciona bien con arreglos pequeños y con los no ordenados. En arreglos
grandes u ordenados conviene aplicar la búsqueda binaria que es más eficiente.
Búsqueda binaria
La estrategia consiste en comparar X con el elemento del medio del array, si es igual
entonces encontramos el elemento, sino, cuando X es menor que el elemento del medio
aplicamos la misma estrategia al array a la izquierda del elemento del medio y si X es mayor
que el elemento del medio aplicamos la misma estrategia al array a la derecha de dicho
elemento.
int izq=1,medio,der=n;
A[0]=X;
do
medio = (izq+der) / 2;
medio=0;
else der=medio-1;
return medio;