Dra. Elisa Schaeffer Estructuras de datos Arreglos Dra. Elisa Schaeffer elisa.schaeffer@gmail.com...

download Dra. Elisa Schaeffer Estructuras de datos Arreglos Dra. Elisa Schaeffer elisa.schaeffer@gmail.com PISIS

of 36

  • date post

    03-Jul-2020
  • Category

    Documents

  • view

    10
  • download

    0

Embed Size (px)

Transcript of Dra. Elisa Schaeffer Estructuras de datos Arreglos Dra. Elisa Schaeffer elisa.schaeffer@gmail.com...

  • Estructuras de datos

    Arreglos

    Dra. Elisa Schaeffer

    elisa.schaeffer@gmail.com

    PISIS / FIME / UANL

    Arreglos– p. 1

  • Estructuras de datos

    Un paso típico en el diseño de un algoritmo es la elección de una estructura de datos apropiada para el problema.

    Revisamos algunas estructuras que se utiliza en construir algoritmos eficientes.

    Arreglos– p. 2

  • Arreglos

    Un arreglo es una estructura capaz de guardar en un orden fijo n elementos.

    Los índices de las posiciones pueden empezar de cero

    a[] = [a0, a1, a2, . . . , an−1]

    o alternativamente de uno b[] = [b1, b2, . . . , bn−1, bn]. Se refiere al elemento con índice k como a[k].

    Arreglos– p. 3

  • Acceso a los contenidos

    El tiempo de accesodel elemento en posición k en un arreglo es O (1).

    Por defecto, se asume con los elementos guardados en un arreglo no est́an ordenadospor ningún criterio.

    Arreglos– p. 4

  • Búsqueda de un elemento

    La complejidad de identificar si un arreglo no ordenado a[] contiene un cierto elemento x es O (n).

    Arreglos– p. 5

  • Búsqueda de un elemento

    La complejidad de identificar si un arreglo no ordenado a[] contiene un cierto elemento x es O (n).

    Habrá que comprar cada elemento a[k] con x.

    Arreglos– p. 5

  • Búsqueda de un elemento

    La complejidad de identificar si un arreglo no ordenado a[] contiene un cierto elemento x es O (n).

    Habrá que comprar cada elemento a[k] con x.

    Terminar al encontrar igualdad o al llegar al final.

    Arreglos– p. 5

  • Búsqueda de un elemento

    La complejidad de identificar si un arreglo no ordenado a[] contiene un cierto elemento x es O (n).

    Habrá que comprar cada elemento a[k] con x.

    Terminar al encontrar igualdad o al llegar al final.

    Si el elemento no está en el arreglo, tenemos el peor caso de exactamente n comparaciones.

    Arreglos– p. 5

  • Usos de arreglos

    Arreglos sirven bien para situaciones donde el número de elementos que se necesita es fijo y conocidoo no varia mucho de repente. Si el tamaño no está fijo ni conocido, comúnmente hay que ajustar el tamaño por reservar en la memoria otro arreglo del tamaño deseado y copiar los contenidos del arreglo actual al nuevo.

    Si eses ajustes de la capacidad ocurren con mucha frecuencia, el arreglo no es la estructura adecuada para la tarea.

    Arreglos– p. 6

  • Búsqueda binaria

    Si el arreglo está ordenado en un orden conocido, un algoritmo mejor para encontrar un elemento igual a x es la búsqueda binaria: Comparar x con el elemento a[k] donde k = ⌊n

    2 ⌋a.

    a[k] se llama el elemento pivote. a o k = ⌈n

    2 ⌉, depende de si lośındices comienzan de cero o uno

    Arreglos– p. 7

  • Búsqueda binaria

    Si a[k] = x, tuvimos suerte y la búsqueda ya terminó. Las otras opciones son:

    (I) Si a[k] < x y el arreglo está en orden creciente, habrá que

    buscar entre los elementos a[k + 1] y el último elemento.

    (II) Si a[k] > x y el arreglo está en orden creciente, habrá que

    buscar entre el primer elemento y el elemento a[k − 1].

    (III) Si a[k] < x y el arreglo está en orden decreciente, habrá

    que buscar entre el primer elemento y el elemento a[k − 1].

    (IV) Si a[k] > x y el arreglo está en orden decreciente, habrá que

    buscar entre los elementos a[k + 1] y el último elemento.

    Arreglos– p. 8

  • Algoritmo recursivo

    Entonces, si i es el primer índice del área donde buscar y j es el último índice del área, repetimosel mismo procedimiento de elección de k y comparación con un arreglo a(1) = [ai, ai+1, . . . , aj−1, aj ].

    El resto del arreglo nunca será procesado, que nos ofrece un ahorro.

    De esta manera, si el arreglo siempre se divide en dos partes de aproximadamente el mismo tamaño, la iteración termina cuando la parte consiste de un sólo elemento.

    Arreglos– p. 9

  • El peor caso

    El peor caso es que el elemento esté en la primera o la última posición del arreglo.

    El elemento pivote es a[k] tal que k = ⌊n2 ⌋. Estamos buscando para el elemento pequeño x en un arreglo que no lo contiene, x < a[i] para todo i.

    Arreglos– p. 10

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    Arreglos– p. 11

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    El tamaño de la parte que queda para buscar tiene al máximo ⌈n

    2 ⌉ elementos.

    Arreglos– p. 11

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    El tamaño de la parte que queda para buscar tiene al máximo ⌈n

    2 ⌉ elementos.

    Al último nivel el tamaño de la parte es uno.

    Arreglos– p. 11

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    El tamaño de la parte que queda para buscar tiene al máximo ⌈n

    2 ⌉ elementos.

    Al último nivel el tamaño de la parte es uno.

    =⇒ habrá log2(n) divisiones.

    Arreglos– p. 11

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    El tamaño de la parte que queda para buscar tiene al máximo ⌈n

    2 ⌉ elementos.

    Al último nivel el tamaño de la parte es uno.

    =⇒ habrá log2(n) divisiones.

    Cada división contiene una comparación de x con un a[k] y la asignación del nuevo índice inferior y el nuevo índice superior.

    Arreglos– p. 11

  • Análisis del peor caso

    ¿Cuántas divisionestiene el peor caso?

    El tamaño de la parte que queda para buscar tiene al máximo ⌈n

    2 ⌉ elementos.

    Al último nivel el tamaño de la parte es uno.

    =⇒ habrá log2(n) divisiones.

    Cada división contiene una comparación de x con un a[k] y la asignación del nuevo índice inferior y el nuevo índice superior.

    Entonces son 3 log2(n) operaciones y la complejidad asintótica es O (log(n)).

    Arreglos– p. 11

  • Algoritmo de burbuja

    Hay varios algoritmos para ordenar un arreglo, esto siendo uno de los más básicos y menos eficientes.

    (I) Inicia una variable contadora a cero: c := 0.

    (II) Comenzando desde el primer elemento, compáralo con el siguiente.

    (III) Si su orden está correcto con respeto a la ordenación deseada, déjalos así.

    (IV) Si no están en orden, con una variable auxiliar t, intercambia sus valores y incrementa a la contadora, c := c+ 1.

    (V) Avanza a comparar el segundo con el tercero, repitiendo el mismo procesamiento, hasta llegar al final del arreglo.

    (VI) Si al final, c 6= 0, asigna c := 0 y comienza de nuevo.

    (VII) Si al final c = 0, el arreglo está en la orden deseada.

    Arreglos– p. 12

  • Peor caso de ordenamiento burbuja

    En cada paso un elementoencuentra su lugar =⇒ el número máximo de iteracioneses n.

    Arreglos– p. 13

  • Peor caso de ordenamiento burbuja

    En cada paso un elementoencuentra su lugar =⇒ el número máximo de iteracioneses n. En el peor caso es que el orden de los elementos es exactamente lo contrarioa lo deseado.

    Arreglos– p. 13

  • Peor caso de ordenamiento burbuja

    En cada paso un elementoencuentra su lugar =⇒ el número máximo de iteracioneses n. En el peor caso es que el orden de los elementos es exactamente lo contrarioa lo deseado. =⇒ En cada iteración, se hace n− 1 comparaciones y en el peor caso cada uno llega a un intercambio de posiciones.

    Arreglos– p. 13

  • Peor caso de ordenamiento burbuja

    En cada paso un elementoencuentra su lugar =⇒ el número máximo de iteracioneses n. En el peor caso es que el orden de los elementos es exactamente lo contrarioa lo deseado. =⇒ En cada iteración, se hace n− 1 comparaciones y en el peor caso cada uno llega a un intercambio de posiciones.

    =⇒ La complejidad asintótica del algoritmo es O (

    n2 )

    .

    Arreglos– p. 13

  • Ejemplo

    1 2 3 4 5 3 4 5 2 1 2 1 3 4 5 4 3 5 2 1 2 3 1 4 5 4 5 3 2 1 2 3 4 1 5 2 3 4 5 1 4 5 3 2 1

    5 4 3 2 1 2 3 4 5 1 3 2 4 5 1 5 4 3 2 1 3 4 2 5 1 3 4 5 2 1 3 4 5 1 2

    Arreglos– p. 14

  • Ordenación por selección

    Dado un arreglo de n elementos, podemos ordenar sus elementos en el orden creciente con el siguiente procedimiento:

    (I) Asigna i := primer índice del arreglo a[].

    (II) Busca entre i y el fin del arreglo el elemento menor.

    (III) Denote el índice del mejor elemento por k y guarda su valor

    en una variable auxiliar t := a[k].

    (IV) Intercambia los valores de a[i] y a[k]: a[k] := a[i], a[i] := t.

    (V) Incrementa el índice de posición actual: i := i+ 1.

    (VI) Itera hasta que i esté en el fin del arreglo.

    Arreglos– p. 15

  • Peor caso

    En el peor caso, cuando los valores del arreglo están en orden reverso a lo deseado, la primera iteración tiene n− 1 comparaciones, la segunda tiene n− 2, etcétera, hasta que el último solamente tiene una.

    1 + 2 + . . .