Estructura de Datos

Introducción

 

 La programación es el proceso utilizado para idear y ordenar las acciones necesarias para realizar un proyecto, preparar ciertas máquinas o aparatos para que empiecen a funcionar en el momento y en la forma deseados o elaborar programas para su empleo en computadoras.

En la actualidad, la noción de programación se encuentra muy asociada a la creación de aplicaciones informática y videojuegos. Es el proceso por el cual una persona desarrolla un programa valiéndose de una herramienta que le permita escribir el código (el cual puede estar en uno o varios lenguajes, como C++, Java y Python, entre otros) y de otra que sea capaz de “traducirlo” a lo que se conoce como lenguaje de máquina, que puede comprender el microprocesador


Estructura de datos

En ciencias de la computación, una estructura de datos es una forma particular de organizar datos en una computadora para que puedan ser utilizados de manera eficiente. Diferentes tipos de estructuras de datos son adecuados para diferentes tipos de aplicaciones, y algunos son altamente especializados para tareas específicas.

 

Las estructuras de datos son un medio para manejar grandes cantidades de datos de manera eficiente para usos tales como grandes bases de datos y servicios de indización de Internet. Por lo general, las estructuras de datos eficientes son clave para diseñar algoritmos eficientes. Algunos métodos formales de diseño y lenguajes de programación destacan las estructuras de datos, en lugar de los algoritmos, como el factor clave de organización en el diseño de software.

Un vector

es una serie de elementos en un orden específico, por lo general todos del mismo tipo (si bien los elementos pueden ser de casi cualquier tipo). Se accede a los elementos utilizando un entero como índice para especificar el elemento que se requiere. Las implementaciones típicas asignan palabras de memoria contiguas a los elementos de los arreglos (aunque no siempre es el caso). Los arreglos pueden cambiar de tamaño o tener una longitud fija.

 

Un vector asociativo

 

 (también llamado diccionario o mapa) es una variante más flexible que una matriz, en la que se puede añadir y eliminar libremente pares nombre-valor. Una tabla de hash es una implementación usual de un arreglo asociativo.

Un registro

 

(también llamado tupla o estructura) es una estructura de datos agregados. Un registro es un valor que contiene otros valores, típicamente en un número fijo y la secuencia y por lo general un índice por nombres. Los elementos de los registros generalmente son llamados campos o celdas.

Una unión

 

 es una estructura de datos que especifica cuál de una serie de tipos de datos permitidos podrá ser almacenada en sus instancias, por ejemplo flotante o entero largo. En contraste con un registro, que se podría definir para contener un flotante y un entero largo, en una unión, sólo hay un valor a la vez. Se asigna suficiente espacio para contener el tipo de datos de cualquiera de los miembros.

Un tipo variante

 

(también llamado registro variante o unión discriminada) contiene un campo adicional que indica su tipo actual.

Un conjunto

es un tipo de datos abstracto que puede almacenar valores específicos, sin orden particular y sin valores duplicados.

Un multiconjunto

es un tipo de datos abstracto que puede almacenar valores específicos, sin orden particular. A diferencia de los conjuntos, los multiconjuntos admiten repeticiones.

Un grafo

 

es una estructura de datos conectada compuesta por nodos. Cada nodo contiene un valor y una o más referencias a otros nodos. Los grafos pueden utilizarse para representar redes, dado que los nodos pueden referenciarse entre ellos. Las conexiones entre nodos pueden tener dirección, es decir un nodo de partida y uno de llegada.

Un árbol

 

es un caso particular de grafo dirigido en el que no se admiten ciclos y existe un camino desde un nodo llamado raíz hasta cada uno de los otros nodos. Una colección de árboles es llamada un bosque.

Una clase

 

es una plantilla para la creación de objetos de datos según un modelo predefinido. Las clases se utilizan como representación abstracta de conceptos, incluyen campos como los registros y operaciones que pueden consultar el valor de los campos o cambiar sus valores.

 

Soporte en los lenguajes

 

La mayoría de los lenguajes ensambladores y algunos lenguajes de bajo nivel, tales como BCPL, carecen de soporte de estructuras de datos. En cambio, muchos lenguajes de alto nivel y algunos lenguajes ensambladores de alto nivel, tales como MASM, tienen algún tipo de soporte incorporado para ciertas estructuras de datos, tales como los registros y arreglos. Por ejemplo, los lenguajes C y Pascal soportan estructuras y registros, respectivamente, además de arreglos y matrices multidimensionales. La mayoría de los lenguajes de programación disponen de algún tipo de biblioteca o mecanismo que permita el uso de estructuras de datos en los programas. Los lenguajes modernos por lo general vienen con bibliotecas estándar que implementan las estructuras de datos más comunes. Ejemplos de ello son la biblioteca Standard Template Library de C++, las colecciones de Java3 y las bibliotecas .NET de Microsoft.

 

Estructuras de datos en programación

 

En programación, una estructura de datos puede ser declarada inicialmente escribiendo una palabra reservada, luego un identificador para la estructura y un nombre para cada uno de sus miembros, sin olvidar los tipos de datos que estos representan. Generalmente, cada miembro se separa con algún tipo de operador, carácter o palabra reservada.

En el lenguaje de programación Pascal, es posible crear una estructura de datos de la forma mencionada. La sintaxis básica es:

Estruct Identificador, _

              Miembro1:TipoDeDato, _

              Miembro2:TipoDeDato, _

              ...

              Miembro9:TipoDeDato

Para acceder a los miembros de una estructura, primero se debe crear una referencia a esta, generalmente con una variable de tipo; luego se pueden editar y obtener los datos de los miembros libremente.

 Estruc Estructura,Miembro1:Entero,Miembro2:Cadena,Miembro3:Byte

 Var Variable:Estructura

 Variable.Miembro1 = 40000

 Variable.Miembro2 = "Hola Mundo"

 Variable.Miembro3 = 255

 Mensaje(Variable.Miembro2) ' Muestra "Hola Mundo"

Arreglos de una y dos dimensiones.

Cuando hablamos de variables podemos imaginarlas como una caja para guardar cosas, una caja que tiene una etiqueta en la que podemos indicar que esta guardado dentro.

etiqueta = valor

Dependiendo del lenguaje que estemos usando, en esa caja solo podremos guardar un tipo específico de informacion números enteros, números flotantes, cadenas de caracteres, un solo carácter. O sera una caja multipropósito que nos permitirá guardar cualquier tipo de información en ella.

¿Pero qué ocurre cuando necesitamos guardar más de un dato de la misma índole?

Imaginemos que estamos haciendo un algoritmo para generar el listado de los asistentes a nuestra fiesta de cumpleaños. El algoritmo solicitará el nombre de las personas y luego al finalizar imprimirá el listado. Supongamos que sólo deseamos invitar a 5 amigos.

Inicio
  invitado1 = ""
  invitado2 = ""
  invitado3 = ""
  invitado4 = ""
  invitado5 = ""
  
  imprimir "Como se llama el invitado 1? "
  leer invitado1  imprimir "Como se llama el invitado 2? "
  leer invitado2  imprimir "Como se llama el invitado 3? "
  leer invitado3  imprimir "Como se llama el invitado 4? "
  leer invitado4  imprimir "Como se llama el invitado 5? "
  leer invitado5  imprimir "Los invitados a tu fiesta son:"
  imprimir invitado1
  imprimir invitado2
  imprimir invitado3
  imprimir invitado4
  imprimir invitado5
    

Fin

Como en una variable es posible guardar un solo dato, esto nos obliga a tener una variable por cada invitado que queremos que venga a nuestra fiesta.

¿Pero qué ocurre si queremos invitar a más personas?

Tendremos que agregar mas variables y agregar las lineas correspondientes para leer el valor del nuevo invitado y luego imprimir su nombre.

Quien use nuestro algoritmo no percibirá diferencia alguna, pero para nosotros que debemos darle mantenimiento empezará a ser una pesadilla a medida que se necesite agregar más personas.

Arreglos de una dimensión

 

Para estos casos contamos con una estructura de datos llamada arreglo o vector, que nos permite agrupar bajo una misma etiqueta un conjunto de datos. Podemos imaginarlos como una caja grande dividida en compartimientos iguales. Al crearla debemos suministrar la cantidad de compartimientos que deseamos que tenga nuestra caja.

etiqueta_arreglo[cantidad]

Cuando queremos guardar algo en nuestro arreglo debemos guardarlo en alguna de las cajas.

invitados[5]

invitados[0] = "Cosme Fulanito"

En la primera línea crea nuestro conjunto de cajas, la segunda guarda dentro de la primera caja la información del nombre. El número que está encerrado entre corchetes al crear la variable es la cantidad de cajas que deseamos que tenga. Luego al interactuar con el arreglo el número entre los corchetes representa la caja dentro del arreglo a la que estamos haciendo referencia. Este valor es llamado índice.

Ahora, reescrito nuestro algoritmo queda de la siguiente forma:

Inicio
invitados[5] = ""
i = 0
para i = 0 hasta 4 hacer
imprimir "Como se llama el invitado " i+1 "? "
leer invitados[i]
fin
imprimir "Los invitados a tu fiesta son:"
para i = 0 hasta 4 hacer
imprimir invitados[i]
fin
Fin

Ahora no importa cuántos invitados nos pidan, con hacer unos cambios menores podremos satisfacer el requerimiento.

La primera línea luego del inicio es la “creación” del arreglo. Su igualación a la cadena vacía es una forma de indicar que estamos iniciando todos los valores del arreglo a una cadena vacía. Las sintaxis para hacer esto varían de lenguaje en lenguaje, así que para estos artículos yo escogí esta forma de hacerlo. El ciclo nos permite llenar el arreglo de forma ordenada es decir, la primera caja, luego la segunda, la tercera y asi sucesivamente hasta completar todas. Nótese que la instrucción leer contiene el nombre del arreglo y como como índice la variable contador del ciclo, lo que permite guardar en cada vuelta el nuevo dato en cajas contiguas.

Luego para mostrar los datos volvemos a hacer uso de un ciclo e imprimimos el valor de la caja correspondiente al valor que posea el contador en ese momento.

¿Cómo hacemos para guardar datos de distinto tipo para un grupo grande de informacion?

Imaginemos por ejemplo que queremos hacer un listado de nuestros amigos y su teléfono y dirección, pero tenemos la limitante de poder guardar solo un tipo de dato en un arreglo.

¡Podemos usar varios arreglos y usarlos en paralelo!

Veamos:

Inicio
nombres[5] = ""
telefon[5] = ""
direcci[5] = ""
i = 0
para i = 0 hasta 4 hacer
imprimir "Nombre del amigo " i + 1 " "
leer nombres[i]
imprimir "Teléfono del amigo " i + 1 " "
leer telefon[i]
imprimir "Dirección del amigo " i + 1 " "
leer direcci[i]
fin
imprimir "Listado de teléfonos y direcciones de amigos"
para i = 0 hasta 4 hacer
imprimir nombres[i] " " telefon[i] " " direcci[i]
fin
Fin
















Como puede observarse en el apartado de la carga de datos, guardamos todos los datos de una persona con el mismo índice en los tres arreglos. Así el nombre, el teléfono y la dirección de índice 3 le pertenecen a la misma persona

Arreglos de dos dimensiones

Pero ahora. ¿Que pasa si queremos guardar más de un teléfono o mas de una dirección? Volvemos al mismo dilema anterior, el crear arreglos de tipo telefono1, telefono2 o direccion1, direccion2 escala hasta cierto nivel.

Bueno, para esto también tenemos opción, se llaman arreglos de dos dimensiones o matrices.

Tomemos nuevamente nuestro ejemplo anterior y decidamos que guardaremos 2 teléfonos por persona y 2 direcciones.

Inicio
nombres[5] = ""
telefon[5][2] = ""
direcci[5][2] = ""
i = 0
j = 0
para i = 0 hasta 4 hacer
imprimir "Nombre del amigo " i + 1 " "
leer nombres[i]
para j = 0 hasta 1 hacer
imprimir "Teléfono " j + 1 " del amigo " i + 1 " "
leer telefon[i][j]
fin
para
j = 0 hasta 1 hacer
imprimir "Dirección " j + 1 " del amigo " i + 1 " "
leer direcci[i][j]
fin
fin
imprimir "Listado de teléfonos y direcciones de amigos"
para i = 0 hasta 4 hacer
imprimir "Nombre: " nombres[i]
para j = 0 hasta 1 hacer
imprimir "Teléfono " j + 1 " " telefon[i][j]
fin
para j = 0 hasta 1 hacer
imprimir "Dirección " j + 1 " " direcci[i][j]
fin
fin
Fin

Obsérvese que ahora además del ciclo que nos permite avanzar en las personas que vamos a guardar, tenemos un ciclo adicional para el telefono y asi poder guardar los dos telefonos que queremos por persona, y repetimos la estrategia para guardar las direcciones. Asi para cada persona nos preguntara, dos telefonos y dos direcciones.

Luego para mostrar la informacion volvemos a hacer uso de la misma estrategia, un ciclo para movernos en las personas y dos pequeños ciclos, uno para imprimir los teléfonos y otro para imprimir las direcciones.

variable[indice] = valor

La nomenclatura tambien cambia ahora en lugar de tener  Tenemos

variable[indice1][indice2] = valor

En el caso de nuestro ejemplo especifico seria:

telefon[persona][orden_telefono]

El primer índice corresponde a la posición de la persona en el listado y el segundo al orden de los teléfonos, primer teléfono introducido o segundo teléfono introducido.

Pero con los arreglos de dos dimensiones podemos hacer mucho mas, por ejemplo podemos guardar los datos ventas de x cantidad de vendedores durante los 12 meses del año para ello creariamos una matriz como la siguiente:

ventas[vendedor][meses]

 

Ahora para hacerlo un ejemplo tenemos:

Inicio
  vendedores[10] = ""
  ventas[10][12] = 0
  i = 0
  j = 0
  sumatoria = 0
  para i = 0 hasta 9 hacer
     imprimir "Introduzca el nombre del vendedor " i + 1
     para j = 0 hasta 11 hacer
       imprimir "Cuánto vendió " vendedores[i] " el mes " j + 1
       leer ventas[i][j]
     fin
  fin   imprimir "Total y promedio de ventas por vendedor"
  para i = 0 hasta 10 hacer
    imprimir "Vendedor: " vendedores[i]
    sumatoria = 0
    para j = 9 hasta 11 hacer
       sumatoria = sumatoria + ventas[i][j]
    fin
    imprimir "Total de ventas: " sumatoria
    imprimir "Promedio de ventas: " sumatoria / 12
  fin
 imprimir "Total y promedio de ventas por mes"
  para i = 0 hasta 11 hacer
     imprimir "Promedio del mes " i + 1
     sumatoria = 0
     para j = 0 hasta 9 hacer
       sumatoria = sumatoria + ventas[j][i]
     fin
     imprimir "Total de ventas del mes " i + 1 " es " sumatoria
     imprimir "Promedio de ventas del mes " i + 1 " es " sumatoria/10
  fin
Fin

 

En este ejemplo recorrimos la matriz de dos formas distintas, la primera fila a fila, es decir para cada vendedor, sumando las ventas de cada mes y dar el total y poder calcular también el promedio dividiendo todo lo vendido durante el año por un vendedor entre los meses del año.

La segunda forma fue columna a columna, sumando todo lo vendido por cada vendedor en un mes específico y calculando el total y el promedio de ventas de los vendedores en ese mes.

Nótese como los ciclos permanecen igual, i el más externo, j el más interno pero en la variable de la matriz se usan distinto, obviamente los límites también cambian.

 

ARREGLOS DE MÁS DE DOS DIMENSIONES

 

Para algunas aplicaciones se requieren arreglos de más de dos dimensiones. En esta lección se consideran sólo arreglos de tres dimensiones, ya que sólo unas cuantas aplicaciones especializadas requieren arreglos de mayor dimensión. La forma más fácil de imaginar un arreglo de tres dimensiones es dibujar un cubo. Piense en un arreglo de tres dimensiones como la combinación de algunos arreglos de dos dimensiones para formar una tercera dimensión, profundidad. El cubo se hace de filas (dimensión vertical), columnas (dimensión horizontal) y planos (dimensión de profundidad) De esta manera, se localiza un elemento dado dentro de un arreglo de cubo especificando su plano, fila y columna.

 

Ahora, veamos un ejemplo práctico de un arreglo de tres dimensiones para que sea posible observar cómo se define y se acceda en C++. Piense en estas lecciones como un arreglo en tres dimensiones, donde cada página de las lecciones es un arreglo bidimensional compuesto de filas y columnas. Entonces las páginas combinadas forman los planos dentro de un arreglo de tres  dimensiones que conforman las lecciones. Después suponga que existen 45 líneas en cada página que forman las filas para el arreglo y 80 caracteres por fila que forman las columnas del arreglo.

 

Si existen 750 páginas en las lecciones, existen 750 planos en el arreglo. De esta manera, este arreglo de las lecciones es un arreglo de 45 × 80 × 750. ¿Cuáles son los elementos del arreglo y cuántos hay? Bueno, los elementos del arreglo serán caracteres, ya que éstos forman las palabras en una página. Además existirán 45 × 80 × 750 = 2, 700,000 caracteres, incluyendo espacios en blanco, porque éste es el tamaño de las lecciones en términos de filas, columnas y páginas. ¿Cómo se definirá el arreglo lecciones en C++? ¿Qué opina de esta forma?

 

const int PAGINAS = 750;

const int FILAS = 45;

const int COLUMNAS = 80;

char lecciones[PAGINAS][FILASI[COLUMNASI;

 

Es posible comprender esta definición a partir de su trabajo con arreglos de una y dos dimensiones. Existen tres dimensiones [PAGINAS], [FILAS] y [COLUMNAS] que definen el tamaño del arreglo lecciones. Un arreglo de tres dimensiones en C y C++ se ordena con el plano principal. Esto es porque primero se especifica el tamaño del plano, seguido por el tamaño del renglón, seguido por el tamaño de columna. La clase de datos del arreglo es char, ya que los elementos son caracteres.

 

Después, ¿cómo supone que se acceda a la información del arreglo lecciones? La forma más fácil es utilizar ciclos anidados. ¿Cómo deberán anidarse los ciclos? Ya que el arreglo está ordenado por el plano principal, el ciclo página deberá ser el ciclo externo, y el ciclo columna, el ciclo interno. Esto deja que el ciclo fila se inserte entre los ciclos página y columna. Traduciendo esto al arreglo lecciones, se obtiene:

 

for (int pagina = 0; pagina < PAGINAS; ++pagina)

for (int fila = 0; fila < FILAS; ++fila)

for (int columna = 0; columna < COLUMNAS; ++columna)

<proceso lecciones[pagina][fila][columna]>

 

Con este enfoque de anidamiento, se ejecuta 80 veces el ciclo columna por cada

iteración del ciclo fila, que se ejecuta 45 veces por cada iteración del ciclo pagina. Desde luego, el ciclo pagina se ejecuta 750 veces. Esta estructura for procesará elementos una fila a la vez para una página dada. Observe la utilización de las variables pagina, fila, y columna como los contadores de ciclo. Aquéllas deberán ser diferentes de las constantes (PAGINAS, FILAS, COLUMNAS) que se utilizan para definir el arreglo, ya que éstas son locales para los ciclos for.

PRECAUCIÓN

Cuando se define un arreglo, C++ reserva suficiente memoria primaria para almacenarlo. Ésta es exclusiva para el arreglo definido y no es posible utilizarlo para otras tareas de programación o del sistema. En otras palabras, un arreglo grande consume mucha memoria. Por ejemplo, el arreglo lección, contiene 2,700,000 caracteres elemento. Cada uno de éstos requiere un byte de memoria para almacenarse, por lo tanto C++ asignará casi 2,637 Kbytes de memoria de usuario para el arreglo lecciones. Esto es mucho más de lo que está disponible en algunos sistemas PC y podrá enviar un mensaje de error array size too big durante la compilación. Por lo tanto, cerciórese de que sus arreglos no sean demasiado grandes para almacenarlos en su sistema. Existen otras formas más eficientes del uso de la memoria para almacenar grandes cantidades de datos -una lista vinculada dinámica.

Características de un arreglo tridimensional

 

1.    Tienen filas y columnas, por lo tanto cuenta con dos indices. Generalmente se maneja el concepto de [Fila][Columna], aunque podria ser tambien [Columna][Fila].

2. La relacion entre valores se da por los indices.

3. Los arreglo unidimensionales se ordenan en fila, en cambio los multidimensionales se pueden acomodar en columnas dadas por lo indices.

4. En el anterior ejemplo usamos 5 arreglos que muestra una tabla o una matriz de 4×4, con los arreglos multidimensionales podriamos usar 1 solo arreglo del mismo tamaño (4×4).

5. El recorrido de filas y columnas se hace por medio de ciclos, esta a nuestra eleccion el primer recorrido que deseemos hacer, podriamos recorrer primero la columna que la fila, o recorrer desde determinado índice.

Matriz poco densa regular

 

Una matriz poco densa es aquella que está formada por elementos que en su mayoría son ceros. Este tipo de matrices son matrices cuadradas que se dividen en los siguientes tipos:

·         Matriz triangular superior

·         Matriz triangular inferior

·         Matriz tridiagonal

Matriz triangular superior

En este tipo de matriz los elementos iguales a cero se encuentran debajo de la diagonal principal. Ejemplo:

Para evitar el desperdicio de memoria que se ocasionaría al almacenar una matriz en donde la mayoría de los elementos son ceros, es conveniente traspasar a un arreglo unidimensional todos los elementos diferentes de cero.

El arreglo con los elementos distintos de cero de la matriz anterior es el siguiente:

Una vez que hallamos vaciado la matriz  es indispensable conocer el lugar dentro del arreglo unidimensional en el cual quedaron situados los elementos, y esto se logra con la siguiente formula:

LOC(A[i,j])=base(A) + (n*(i-1)) – ((i-2)*(i-1))/2 + (j-1)

donde:

A=Matríz triangular superior
n=No. total de elementos
j= renglones
i=columnas

Matriz triangular inferior

En este tipo de matrices los elementos iguales a cero se encuentran por encima de la diagonal principal. Ejemplo:

Una vez que vaciamos la matriz en un arreglo unidimensional, la formula para obtener las posiciones de los elementos es la siguiente:

LOC(A[i,j])=base(A) + ((i-1)*i)/2 + (j-1)

Matriz tridiagonal

En ésta, los elementos diferentes de cero se encuentran en la diagonal principal ó en las diagonales por debajo ó encima de ésta. Ejemplo:

Y el arreglo con los elementos diferentes de cero correspondiente a esta matriz es el siguiente:

La localización de los elementos distintos de cero en el arreglo unidimensional se realiza aplicando la siguiente formula:

LOC(A[i,j])=base(A) + 2*i + (j-3)

 Matrices irregulares

 

Java nos permite crear matrices irregulares. Se dice que una matriz es irregular si la cantidad de elementos de cada fila varía. Luego podemos imaginar una matriz irregular:



Como podemos ver la fila cero tiene reservado dos espacios, la fila uno reserva cuatro espacios y la última fila reserva espacio para tres componentes.
Para crear la matriz irregular del gráfico:

La declaración es la misma que para matrices regulares:

int [][] mat;

Primero creamos la cantidad de filas dejando vacío el espacio que indica la cantidad de columnas:

mat=new int[3][];

Luego debemos ir creando cada fila de la matriz indicando la cantidad de elementos de la respectiva fila:

mat[0]=new int[2];

mat[1]=new int[4];

mat[2]=new int[3];

Luego la forma para acceder a sus componentes es similar a las matrices regulares, siempre teniendo en cuenta y validando que exista dicha componente:

mat[0][0]=120;

Dará un error si queremos cargar la tercera componente de la fila cero (esto debido a que no existe):

mat[0][2]=230;

Luego si queremos saber la cantidad de filas que tiene la matriz:

Sytem.out.println(mat.length);

Si queremos saber la cantidad de elementos de una determinada fila:

Sytem.out.println("Cantidad de elementos de la fila 0:"+mat[0].length);

Sytem.out.println("Cantidad de elementos de la fila 1:"+mat[1].length);

Sytem.out.println("Cantidad de elementos de la fila 2:"+mat[2].length);

Problema 1:

Confeccionaremos un programa que permita crear una matriz irregular y luego imprimir la matriz en forma completa.

import java.util.Scanner;

public class MatrizIrregular1 {

    private Scanner teclado;

    private int[][] mat;

   

    public void cargar() {

        teclado=new Scanner(System.in);

        System.out.print("Cuantas fila tiene la matriz:");

        int filas=teclado.nextInt();

        mat=new int[filas][];

        for(int f=0;f<mat.length;f++) {

            System.out.print("Cuantas elementos tiene la fila " + f + ":");

            int elementos=teclado.nextInt();

            mat[f]=new int[elementos];           

            for(int c=0;c<mat[f].length;c++) {

                System.out.print("Ingrese componente:");

                mat[f][c]=teclado.nextInt();

            }

        }

    }

   

    public void imprimir() {

        for(int f=0;f<mat.length;f++) {

            for(int c=0;c<mat[f].length;c++) {

                System.out.print(mat[f][c]+" ");

            }

            System.out.println();

        }

    }

   

    public static void main(String[] ar) {

        MatrizIrregular1 ma=new MatrizIrregular1();

        ma.cargar();

        ma.imprimir();

    }  

}

Primero creamos la cantidad de filas que tendrá la matriz (en los corchetes para las columnas no disponemos valor):

        System.out.print("Cuantas fila tiene la matriz:");

        int filas=teclado.nextInt();

        mat=new int[filas][];

Dentro del primer for pedimos que ingrese la cantidad de elementos que tendrá cada fila y utilizamos el operador new nuevamente, pero en este caso se están creando cada fila de la matriz (Java trata a cada fila como un vector):

        for(int f=0;f<mat.length;f++) {

            System.out.print("Cuantas elementos tiene la fila " + f + ":");

            int elementos=teclado.nextInt();

            mat[f]=new int[elementos];           

Dentro del for interno hacemos la carga de las componentes propiamente dicho de la matriz (podemos ir cargando cada fila a medida que las vamos creando):

            for(int c=0;c<mat[f].length;c++) {

                System.out.print("Ingrese componente:");

                mat[f][c]=teclado.nextInt();

            }

Luego imprimimos la matriz en forma completa teniendo cuidado las condiciones que disponemos en cada for.
El primer for se repite tantas veces como filas tiene la matriz: f<mat.length y
el for interno se repite tantas veces como elementos tiene la fila que estamos procesando

 

c<mat [f].length:

        for(int f=0;f<mat.length;f++) {

            for(int c=0;c<mat[f].length;c++) {

                System.out.print(mat[f][c]+" ");

            }

            System.out.println();

        }

 

Ordenación

 

 

Un diagrama de árbol o metodo de Ordenamiento es una herramienta que se utiliza para  determinar todos los posibles resultados de un experimento aleatorio. En el cálculo de la probabilidad se requiere conocer el número de elementos que forman parte del espacio muestral, estos se pueden determinar con la construcción del diagrama de árbol.

El diagrama de árbol es una representación gráfica de los posibles resultados del experimento, el cual consta una serie de pasos, donde cada uno de los pasos tiene un número finito de maneras de ser llevado a cabo. Se utiliza en los problemas de conteo y probabilidad.

Ordenamiento por Burbuja

La idea básica de este método de ordenamiento es la de comparar pares de valores de llaves e intercambiarlos si no están en sus posiciones relativas correctas.

Como los métodos de selección e inserción vistos anteriormente, el método de burbuja requiere O(n^2) comparaciones. No obstante, el método de la burbuja es frecuentemente usado.

La idea de este método es la de permitir que cada llave flote a su posición adecuada a través de una serie de pares de comparaciones e intercambios con los valores adyacentes. Cada paso haces que una llave suba a su posición final, como una burbuja, en la lista ordenada.

Consideremos otra vez nuestro ejemplo de lista de llaves no ordenadas:

 

Ordenamiento por Selección

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 (dato o registro), 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. Sin embargo, la lista ordenada, podrá ser puesta en la salida, a medida que avancemos.

Ordenamiento de Intercalación

no es propiamente un método de ordenación, consiste en la unión de dos aráis ordenados de modo que la unión esté también ordenada. Para ello, basta con recorrer los aráis de izquierda a derecha e ir cogiendo el menor de los dos elementos, de forma que sólo aumenta el contador del array del que sale el elemento siguiente para el array-suma. Si quisiéramos sumar los arrays {1, 2,4} y {3, 5,6},

 

Tipos de ordenamiento optima segun la estrutura de datos utilizados

Los métodos de ordenamiento interno se aplican cuando el conjunto de datos a clasificar es lo suficientemente pequeño, de tal forma que pueda caber en memoria principal. El tiempo requerido para leer o escribir registros no se considera significativo para la evaluación del rendimiento interno.


Comentarios

Entradas populares de este blog

WPS office para archlinux

Adobe suite Creative Cloud 2020 completa descargar un link mediafire

Calidad en el Servicio a Comensales