arreglos

Upload: henry-lopez

Post on 01-Mar-2016

8 views

Category:

Documents


0 download

DESCRIPTION

Arreglos. Estructuras de datos.

TRANSCRIPT

  • ARREGLOSObjetivoEn esta unidad, se busca que el estudiante pueda entender y comparar las distintas representaciones internas de arreglos, determinando para cada una:

    facilidad de manejo rapidez de acceso

    DefinicinUn arreglo es un sistema de elementos del mismo tipo, indizado por un sistema de coordenadas enteras, que permite acceder y alterar elementos individuales .

    Ejemplos del uso de arreglos:

    int arreglo [5] ; // indizado 0..4 int matriz [5][10] ; // indizado 0..4 * 0..9 arregloPascal: array [11..20, 1..5] of integer ; // de tamao 10 * 5

    Acceso de los elementos:

    arreglo[3] = 4 ,matriz [4,9] = 5 ;arregloPascal [12, 3] = 100 ;

    ProblemaEn los ejemplos anteriores, vemos que la notacin para acceder los elementos es relativamente simple. Sin embargo, para el compilador no es tan simple, ya que implica una serie de clculos relativamente complejos.

    La razn principal, se debe a que cuando se declara un arreglo, la variable que representa dicho arreglo es en realidad una apuntador al primer elemento del arreglo, como es el caso de las variables arreglo, matriz y arregloPascal en los ejemplos anteriores.

    Notacin

    parejas lmite n1..m1 * n2..m2 * ... * nk..mkdonde nx

  • direccin inicial a = &A[n1,n2,...,nk]

    Almacenamiento lexicogrficoAcceder un elemento implica el clculo de una direccin, lo que significa que debe haber un orden en la memoria entre los elementos del arreglo. Dicho orden es el orden lexicogrfico

    orden lexicogrfico por fila: la posicin (a1, a2 , , ak) es menor que (b1, b2, , bk), si y slo si

    para algn 1 < j

  • Caso bidimensionalSupongamos la matriz de 3*4 con los pares lmites 1..3 * 1..4

    a = &A[1,1]

    1,1 1,2 1,3 1,42,1 2,2 2,3 2,43,1 3,2 3,3 3,4En memoria, realmente queda as:

    1,1 1,2 1,3 1,4 2,1 2,2 2,3 2,4 3,1 3,2 3,3 3,4cul sera la frmula que nos permita mapear cualquier elemento de esta matriz?

    Por ejemplo: encontrar el elemento A[2,3]. Dado que el elemento est en la fila 2, sabemos que se debe avanzar totalmente la primera fila. De esta forma tenemos que avanzar 4 elementos, ya que cada fila es de tamao 4.

    Loc (A[2,3]) = ( a + 4) + ( 3 - 1)

    con dimensiones 1..3*1..4, Loc (A[i,j]) = a + (i-1)*4 + j - 1

    En general, con dimensiones n1..m1*n2..m2, Loc (A[i1,i2]) = a + (i1-n1) * (m2-n2+1) + (i2-n2)

    Si se tiene 11..20 * 100 .. 110 entonces el tamao de las filas ser m2-n2+1 = 110 - 100 + 1

    int X [111] : // se mapean de 0 .. 110

    Caso tridimensional1..3 * 1..4 * 1..2

    Tenemos que tamao de la primera dimensin = tamao una matriz = T1

    Tenemos que tamao de la segunda dimensin = tamao una fila = T2

    Loc (A[2,3,2]) = a + 1*T1 + 2*T2 + 1 = a + 1*(4*2) + 2*(2) + 1

    Si tenemos los pares lmites 1..m1 * 1..m2 * 1..m3

    Loc (A[2,3,2]) = a + 1*T1 + 2*T2 + 1

    = a + 1*(m3)*(m2) + 2*(m3) + 1

    en general, para n1..m1 * n2..m2 * n3..m3

    Loc (A[i,j,k]) = a + (i-n1)*T1+ (j-n2)*T2 + (k-n3)

    = a + (i-n1)*(m3-n3+1)*(m2-n2+1) + (j-n2)*(m3-n3+1) + (k-n3)

  • Caso k-dimensionaln1..m1 * n2..m2 * ... * nk..mk

    Loc (A[i1, i2, ... ,ik) = a + (i1-n1)*|1a. Dim| + (i2-n2)*|2a.Dim| + ... + (ik-1 - nk-1)*|k-1 dim| + (ik-nk)

    Tamao de las dimensiones:

    el ltimo vector ( dimensin k-1) = mk - nk + 1

    la ltima matriz ( dimension k -2 ) = (Mk-1 - Nk-1 + 1) * (mk - nk + 1)

    el ltimo cubo (dimensin k-3) = (Mk-2 - Nk-2 + 1) * (Mk-1 - Nk-1 + 1) * (mk - nk + 1)

    ...dimensin K-j = (Mk-j-1 - Nk-j-1 -1) * ...* (Mk-1 - Nk-1 + 1) * (mk - nk + 1)

    ..la primera dimensin ( K-j cuando j=k)(M1 - N1 -1) * ...* (Mk-1 - Nk-1 + 1) * (mk - nk + 1)

    = a + (i1-n1)*|1a. Dim| + (i2-n2)*|2a.Dim| + ...(ik-1-nk)*|k-1 dim| + (ik-1)

    Loc (A[i1,i2,..,ik]) = SUM desde I = 1 hasta k ( (Ii - Ni) * MULT desde x=I hasta k-1 ( Mx - Nx - 1) ) =

    = (i1 - n1 )* (m2-n2+1)(m3-n3+1)....(mk-nk+1) +

    (i2 - n2 ) * (m3-n3+1)....(mk-nk+1) +

    .... +

    (ik-1 - nk-1) * (mk-nk+1) +

    (ik - nk)

    EJERCICIO 1:

    orden lexicogrfico por columna: la posicin (a1, a2 , , ak) es menor que (b1, b2, , bk), si y

    slo si para algn 1 < j

  • 1,1 2,1 3,1 1,2 2,2 3,2 1,3 2,3 3,3 1,4 2,4 3,4

    sea A un arreglo de n1..m1 * n2..m2 ordenado lexicogrficamente por columnas

    Deducir LOC(A[i,j]) = a + (j-n2) * (m1-n1+1) + (i-n1)

    En general:

    Para el arreglo A: n1..m1 * n2..m2 * .... * nk..mkLOC ( A[i1, i2, .., ik] = a + (ik - nk)* (m1 - n1 +1) * (m2 - n2 + 1) * ...* (mk-1 - nk-1 +1 ) +

    (ik-1 - nk-1 ) * (m1 - n1 +1) * (m2 - n2 + 1) * ...* (mk-2 - nk-2 +1 ) +

    ... (i2 - n2 ) * (m1 - n1 +1) +

    (i1 - n1 )

    Algoritmopublic class ArregloLexicografico extends ArregloGeneral {...

    public E get (int i[]) {int sumatoria = 0 ;for (x = 0; x < k ; x++) {

    int productoria = 1 ;for (y=x; y < k ; y++) { productoria *= (m[y] - n [y] + 1) ;}sumatoria += (i[x]-n[x]) * productoria ;

    }return objs [sumatoria] ;}

    .

    .}

    Calcular O ( get(), N) = ? = k2

  • cuadrtico sera O(get,N) = N2

    lineal sera O(get,N) = N

    EJERCICIO: convertir el algoritmo anterior en un algoritmo equivalente de O(N) = k

    Arreglos esparcidosVimos que el uso de arreglos lexicogrficos tiene el mejor rendimiento posible (constante) para el acceso de elementos por ndice. Sin embargo, el hecho de que necesiten reservar memoria contigua para todos sus posibles elementos, implica que existen situaciones en las que no son recomendables, debido principalmente a dos factores:

    1. Desperdicio de memoria: consideremos una matriz de 1,000 por 1,000 elementos, de los cuales slo se estn utilizado 10. Sera un gran desperdicio de memoria, alojar 1,000,000 de elementos para slo utilizar 10.

    2. Incapacidad de alojar espacio para todos los posibles elementos: las hojas electrnicas tienen una gran capacidad de celdas, pero normalmente slo se utiliza una pequea porcin de ellas: Excel tiene su mxima celda en IV65536, lo que significa una capacidad para (26*8+22)*65536 = 15,073,280 celdas. Si cada una de estas ocupara 1 byte, no tendramos memoria suficiente para una hoja electrnica..

    En cualquiera de estos casos resultan tiles los arreglos esparcidos, los cuales tienen como caracterstica fundamental que slo utilizan la memoria realmente necesaria conforme se agregan elementos al arreglo.

    Tcnicas de representacinEntre muchas tcnicas para lograr los arreglos esparcidos, distinguiremos dos principales:

    Arreglos lexicogrficos de encabezados, con celdas de referencias cruzadas. Listas de encablezados

    El uso de arreglos lexicogrficos para los encabezados se ilustran en la siguiente figura:

  • Se tiene un control de encabezados, el cual contiene dos apuntadores: uno para el arreglo de las filas y el otro para las columnas. Los encabezados no necesitan ms informacin que el apuntador al primer nodo de la fila o columna. Cada uno de los nodos tiene la siguiente estructura::

    Los cuatro apuntadores de navegacin nos sirven para facilitar los recorridos y bsqueda de cada nodo. Notemos que, adems de la info, se debe tener en cada nodo la informacin de los ndices que representan, ya que la caraterstica de esparcido no permite calcular el ndice de un nodo basado en sus posicin de forma fcil. Se podra omitir esta informacin, para para buscar cada nodo implicara una doble bsqueda, por fila y columna, para cada nodo, lo cual lo hara muy ineficiente.

    La estrategia bsica del algoritmo de localizacin de un elemento A[i,j]

    Seleccionar el encabezado de las filas, aunque tambin puede ser por columnaPara cada nodo en la lista de la fila i

    Si nodo.j < j nodo = nodo.der ; //seguimos buscando

    sino si nodo.j=j

    return nodo ; //encontramos el nodosino

    return null ; //no se encuentra el nodo con los ndices indicados

  • finfin

    Una implementacin ms formal, podra ser la siguiente:

    public class ArregloEsparcido extends ArregloGeneral {...

    public E get (int i[]) {/* resumiendo a bsqueda por filas */Nodo n = fila [i] ;

    while (n != null && n.col < j) {n = n.derecha ;

    }if ( n == null ) return null ;else return n.obj ;}

    .

    .}

    Analizando el orden de este algoritmo:

    El peor de los casos es una matriz de una solo fila, la cual est llena y estamos buscando el ltimo elemento de dicha fila. En este caso el O(get(i)) = n, es decir lineal, ya que visitaremos todos los elementos.

    Si fuera una matriz cuadrada totalmente llena, entonces n = filas * columnas y filas = columnas

    = x , por lo tanto n = x 2 . Al hacer la bsqueda del ltimo elemento de cada fila, recorreremos x elementos, es decir O(get(i)) = sqrt(n).

    En el caso general, en que las filas != columnas, O(get(i)) = n/columnas, es decir se convierte ensublineal.

    Por lo tanto el orden de este algoritmo varia de lineal a sublineal, dependiendo de la estructura de la matriz.

  • Las otra tcnica de representacin est basada en que tambin los encabezados son listas, en vez de arreglos lexicogrficos. As, otra representacin de la matriz anterior es as:

    Aqu los nodos de los encabezados tendran la siguiente estructura:

    stos nodos pueden ser utilizados en cualquier dimensin. Slo es necesario que contengan el ndice que representan.

  • Esta representacin al seguir manteniendo los nodos con doble enlace en ambas dimensiones, permite tener la misma flexibilidad en el recorrido de elementos que la representacin con encabezados de arreglos. La diferencia bsica es que el recorrido en los encabezados. Sin embargo, cuando se tienen mltiples dimensiones, mantener en los nodos el doble enlace hacia cualquier direccin, complica de gran manera las operaciones de insercin y eliminacin, adems de representar un consumo alto de memoria por uso de dos apuntadores por nodo, por dimensin. Para estos casos se podra utilizar una representacin como la siguiente:

    En este caso, los nodos de informacin ya no necesitan almacenar ni apuntadores, ni ndices de la posicin que representa, ya que dicha posicin, es determinada en el recorrido de los encabezados.

    El almacenamiento encadenado puede ser til para acomodar el crecimientos de los arreglos en direcciones arbitrarias, a costa de de una utilizacin de espacio reducido

    Comparacin de tcnicasEl rendimiento del acceso a los arreglos, est dado por la representacin interna

    Criterios de comparacin simplicidad de acceso a los elementos facilidad de recorridos en diferentes rutas eficiencia de uso del almacenamiento facilidad de crecimiento

    Almacenamiento lexicogrfico vs esparcido

    Ventajas

    clculo fcil ( O(n) = c ) facilidad de recorrido crecimiento fcil en la primera dimensin

    Desventajas

    crecimiento muy costos en las otras dimensiones Uso de la memoria slo es ptimo si est lleno (o casi lleno). Radio = ( tam(objeto) /

    tam(objeto + apuntadores) ) indica el mximo porcentaje de llenado a partir del cual es ms eficiente un arreglo lexicogrfico.

    ARREGLOSObjetivoDefinicinProblemaNotacinAlmacenamiento lexicogrficoCaso unidimensionalCaso bidimensionalCaso tridimensionalCaso k-dimensionalAlgoritmo

    ArreglosesparcidosTcnicas de representacin

    Comparacin de tcnicasCriterios de comparacinAlmacenamiento lexicogrfico vs esparcidoVentajasDesventajas