Estructura de Datos : Búsqueda Binaria


Definiciones

              R1   R2   R3             Rm            Rn-2 Rn-1  Rn
   ........------------------.......--------.......------------------.......
            | K1 | K2 | K3 |         | Km |         |Kn-2|Kn-1| Kn |              n slots
   ........------------------.......--------.......------------------.......

            |<---------------------->|    |<---------------------->|
                 Subarchivo menor              Subarchivo mayor


Funciones

SEQSRCH

Busca en el archivo F, secuencial, con registros R1, R2, ..., Rn y claves K1 =< K2 =< ... =< Kn, por el registro Ri, tal que Ki = K. Si i devuelve 0, no existe un registro en el archivo con la clave buscada. Si i es distinto de 0, es la posición del registro con la clave igual a K. La variable n es la cantidad de registros del archivo. Las variables F, n y K son variables de entrada. La variable i es de salida.

Veamos ejemplos del c lculo de la posici¢n media. Observar que si n = 6, ( 6 + 1 ) / 2 = 3,5 ----> piso de 3,5 = 3. Observar que si n = 9, ( 9 + 1 ) / 2 = 5 ----> piso de 5 = 5. Observar que si l = u, m = ( l + u ) / 2 = ( 2 * l ) / 2 = l, por lo tanto l = u = m.

Ejemplo K > Km

               R1   R2   R3            Rm-1  Rm  Rm+1           Rn-2 Rn-1  Rn                                           Rm-1  Rm  Rm+1
         ...------------------.......------------------.......------------------.......                        .......------------------.......
             | K1 | K2 | K3 |         |Km-1| Km |Km+1|         |Kn-2|Kn-1| Kn |              n slots                   |Km-1| Km |Km+1|
         ...------------------.......------------------.......------------------.......                        .......------------------.......
                                                                                                                              l ....>
               l                             m    l                         u                                                 u
               .                                  .                                                                           m
               ..................>.................

                                                |<--------------------------->|
                                                 Nuevo subarchivo de busqueda

Ejemplo K < Km


               R1   R2   R3            Rm-1  Rm  Rm+1           Rn-2 Rn-1  Rn                                           Rm-1  Rm  Rm+1
         ...------------------.......------------------.......------------------.......                        .......------------------.......
             | K1 | K2 | K3 |         |Km-1| Km |Km+1|         |Kn-2|Kn-1| Kn |              n slots                   |Km-1| Km |Km+1|
         ...------------------.......------------------.......------------------.......                        .......------------------.......
                                                                                                                              l
               l                         u   m                              u                                            <....u
                                         .                                  .                                                 m
                                         .................<..................

             |<--------------------------->|
              Nuevo subarchivo de busqueda

Observar que cuando el subarchivo se reduce a 1 registro, en la proxima vuelta del while se d  que u < l y termina el loop.

Interpretacion usando un arbol binario

Observar que en este algoritmo siempre se usa la clave del registro del medio de un subarchivo como la clave de comparación. Interpretemos la búsqueda binaria como un árbol binario donde el valor de sus nodos es la posición de la clave que se compara. Veamos el siguiente ejemplo :

lo que nos lleva a construir el siguiente árbol binario :
                                              *---*
                                              |1 6|                                                  Primera comparacion
                                              *---*
                                               | |
                        +----------------------+ +----------------------+
                        |                                               |
                      *---*                                           *---*
                      | 8 |                                           |2 4|                          Segunda comparacion
                      *---*                                           *---*
                       | |                                             | |
            +----------+ +----------+                       +----------+ +----------+
            |                       |                       |                       |
          *---*                   *---*                   *---*                   *---*
          | 4 |                   |1 2|                   |2 0|                   |2 8|              Tercera comparacion
          *---*                   *---*                   *---*                   *---*
           | |                     | |                     | |                     | |
      +----+ +----+           +----+ +----+           +----+ +----+           +----+ +----+
      |           |           |           |           |           |           |           |
    *---*       *---*       *---*       *---*       *---*       *---*       *---*       *---*
    | 2 |       | 6 |       |1 0|       |1 4|       |1 8|       |2 2|       |2 6|       |3 0|        Cuarta comparacion
    *---*       *---*       *---*       *---*       *---*       *---*       *---*       *---*
     | |         | |         | |         | |         | |         | |         | |         | |
   +-+ +-+     +-+ +-+     +-+ +-+     +-+ +-+     +-+ +-+     +-+ +-+     +-+ +-+     +-+ +-+
   |     |     |     |     |     |     |     |     |     |     |     |     |     |     |     |
 *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---*
 | 1 | | 3 | | 5 | | 7 | | 9 | |1 1| |1 3| |1 5| |1 7| |1 9| |2 1| |2 3| |2 5| |2 7| |2 9| |3 1|     Quinta comparacion ----> u, l y m en la misma posicion
 *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---* *---*

Luego de la quinta comparacion se sale del loop. No hay mas comparaciones. El paso del raíz a cualquier nodo representa la secuencia de nodos recorridos por el algoritmo para encontrar la clave K o determinar que dicha clave no existe en el archivo. Viendo la altura del árbol, se vé que en el peor caso, se hacen no más de O(log2 n) comparaciones. Observar que estan en el arbol todas las posiciones del archivo. Consideremos el siguiente ejemplo, el que busca una clave no existente en el archivo, pero que nos lleva al nodo de la posicion 29.
   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31
 |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|

   l                                                           m   l                           m   l           m   l   m   u
                                                                                                                   u
                                                                                                                   m