Está en la página 1de 12

República Bolivariana de Venezuela

Ministerio del Poder Popular para la Defensa

Universidad Nacional Experimental Politécnica de la Fuerza Armada Nacional


Bolivariana (UNEFA)

Extensión – Guacara

Guacara, Edo – Carabobo

Unidad 5:
Estructuras estáticas de estados

Profesor:​ Luis Solano Alumno:​ Jeykel Infante

Asignatura:​ Lenguajes de programación III CI ​27.927.489

Ing. En sistemas

6 to Semestre

Sábado, 21 de noviembre de 2020


Vectores y arreglos

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.

Arreglos con múltiple subíndices

Es la representación de tablas de valores, consistiendo de información arreglada en


renglones y columnas. Para identificar un elemento particular de la tabla, deberemos de
especificar dos subíndices; el primero identifica el renglón del elemento y el segundo
identifica la columna del elemento. A los arreglos que requieren dos subíndices para
identificar un elemento en particular se conocen como arreglo de doble subíndice. Note que
los arreglos de múltiples subíndices pueden tener más de dos subíndices. El estándar ANSI
indica que un sistema ANSI C debe soportar por lo menos 12 subíndices de arreglo.
Operaciones con arreglos

Las operaciones en arreglos pueden clasificarse de la siguiente forma:

● Lectura: este proceso consiste en leer un dato de un arreglo y asignar un valor a


cada uno de sus componentes
● Escritura: Consiste en asignarle un valor a cada elemento del arreglo.
● Asignación: No es posible asignar directamente un valor a todo el arreglo
● Actualización: Dentro de esta operación se encuentran las operaciones de eliminar,
insertar y modificar datos. Para realizar este tipo de operaciones se debe tomar en
cuenta si el arreglo está o no ordenado.
● Ordenación.
● Búsqueda.
● Insertar.
● Borrar.
● Modificar.

Ordenaciones en Arreglos

La importancia de mantener nuestros arreglos ordenados radica en que es mucho más


rápido tener acceso a un dato en un arreglo ordenado que en uno desordenado.

Existen muchos algoritmos para la ordenación de elementos en arreglos, algunos de ellos


son:

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.

Ordenación por burbuja

Es el método de ordenación más utilizado por su fácil comprensión y programación, pero es


importante señalar que es el más ineficiente de todos los métodos. Este método consiste en
llevar los elementos menores a la izquierda del arreglo ó los mayores a la derecha del
mismo. La idea básica del algoritmo es comparar pares de elementos adyacentes e
intercambiarlos entre sí hasta que todos se encuentren ordenados.

Ordenación por mezcla

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.

Algoritmos de búsqueda que existen

Búsquedas en Arreglos: Una búsqueda es el proceso mediante el cual podemos localizar un


elemento con un valor específico dentro de un conjunto de datos. Terminamos con éxito la
búsqueda cuando el elemento es encontrado.

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

Un arreglo se identifica por su nombre encerrando los elementos entre corchetes y


separándolos por coma.

Notación Lenguaje de programación

ArregloEjemplo[índice_0][índice_1]...[índice C, C++, PHP, Javascript, etc.


_N-1]

ArregloEjemplo2(índice_1,índice_2...,índice Basic, MATLAB


_N)
Forma de acceso

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

Discutiremos el problema de ordenar un array de elementos. A los efectos

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).

Ordenamientos que no se pueden realizar en memoria deben realizarse en disco. Se


encuentran ejemplos en la bibliografía.
Preliminares

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.

Asumimos la existencia de operadores de comparación < y >. Llamaremos al ordenamiento


que se basa en el uso de estos operadores ordenamiento basado en comparaciones.

Ordenamiento Burbuja

Consideremos el programa de ordenamiento burbuja que ordena un array de enteros en


orden creciente:

void burbuja(int a[],int n)

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]);

void intercambio(int *a, int *b)

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 uno de los algoritmos más simples. Consiste en N − 1 pasadas. En las pasadas 2 a N se


cumplira que los elementos de las posiciones 1 a P están ordenados. En la pasada P
movemos el elemento P-esimo a su lugar correcto,este lugar es encontrado en las
posiciones de los elementos 1 a P. El programa

es el siguiente:

void Sort por insercion (int A[], int N)

int j,P,tmp;

A[0]=Min int;

for(P=2;P<=N;P++)

j=P;

tmp=A[P];

while(tmp < A[j-1])

A[j] = A[j-1];

j-=1;

A[j]=tmp;

La idea del programa es la siguiente: colocar un centinela en la primera posición (posición


0) por lo cual el elemento a insertar será colocado en caso de que sea el mínimo en la
posición 1. Guardamos el valor del elemento a insertar en una variable auxiliar tmp. Si tmp
es menor que A[j-1] su posición será anterior o igual a (j-1), luego corro el elemento de la
posición (j-1) a la posición j para hacer lugar para tmp. Repito esto para todos los elementos
anteriores al tmp. Cuando encuentre una posición tal que tmp no es menor indica que los
elementos anteriores están ordenados (estaban ordenados del 0 al P − 1). Luego lo único
que resta es colocar tmp en la posición j.

Ordenamiento por Selección (Selection Sort)

La idea del selection sort es la siguiente : en la pasada i-esima seleccionamos el elemento


menor entre A[i], . . . , A[n] y lo intercambiamos con el A[i]. Como resultado, luego de i
pasadas los menores i elementos ocuparan las posiciones A[1], . . . , A[i] y además los
elementos de dichas posiciones estarán ordenados.

El programa es el siguiente:

void Sort por seleccion (int A[], int N)

int i,j,sel,clave sel;

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

Con frecuencia el programador trabaja con grandes cantidades de información almacenada


en arreglos. Podría ser necesario determinar si algún arreglo contiene un valor que sea
igual a cierto valor clave.

El proceso para encontrar un elemento particular en un arreglo se llama búsqueda.


Estudiaremos dos técnicas de búsqueda: una técnica simple llamada búsqueda lineal y una
más eficiente llamada búsqueda binaria.

Ambos programas se pueden implementar recursivamente o no. En este capítulo veremos


la implementación no recursiva.

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.

int busqueda lineal (int A[], int clave, int n)

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

Dados un entero X y un array A de n enteros que se encuentran ordenados y en memoria,


encontrar un i tal que A[i] == X o retornar 0 si X no se encuentra en el array (consideramos
los elementos del array de 1 a N.

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.

Para simplificar el código definimos A[0]=X.


int busqueda binaria(int A[],int X,int n)

int izq=1,medio,der=n;

A[0]=X;

do

medio = (izq+der) / 2;

if(izq > der)

medio=0;

else if A[medio] < X

izq = medio +1;

else der=medio-1;

while (A[medio] != X);

return medio;

También podría gustarte