|
| 1 | +# Búsqueda exponencial |
| 2 | + |
| 3 | +#### Requisitos previos |
| 4 | + |
| 5 | +- [Algoritmo de búsqueda binaria](https://github.com/faridevnz/Algorithms-Explicación/blob/master/en/Search%20Algorithms/Binary%20Search.md) |
| 6 | + |
| 7 | +#### Declaración de problema |
| 8 | + |
| 9 | +Dada una matriz ordenada de elementos `*n*`, escriba una función para buscar el índice de un elemento determinado (destino) |
| 10 | + |
| 11 | +#### Enfoque |
| 12 | + |
| 13 | +- Búsqueda del **rango** dentro del cual se incluye el objetivo aumentando *index* por poderes de 2 |
| 14 | +- Si este rango existe en la matriz aplicar el algoritmo de búsqueda binaria sobre él |
| 15 | +- Más retorno -1 |
| 16 | + |
| 17 | +#### Ejemplo |
| 18 | + |
| 19 | +```markdown |
| 20 | +arr = [1, 2, 3, 4, 5, 6, 7, ... 998, 999, 1_000] |
| 21 | + |
| 22 | +objetivo = 998 |
| 23 | +índice = 0 |
| 24 | +1. BÚSQUEDA DEL RANGO |
| 25 | +índice = 1, 2, 4, 8, 16, 32, 64, ..., 512, ..., 1_024 |
| 26 | +después de 10 iteración tenemos el índice en 1_024 y fuera de la matriz |
| 27 | +2. BÚSQUEDA BINARIA |
| 28 | +Ahora podemos aplicar la búsqueda binaria en el subarray de 512 y 1_000. |
| 29 | +``` |
| 30 | + |
| 31 | +**Nota**: aplicamos la búsqueda binaria de 512 a 1_000 porque en `i = 2^10 = 1_024` la matriz está finisced y el número de destino es menor que el índice más reciente de la matriz ( 1_000 ). |
| 32 | + |
| 33 | +#### Complejidad horaria |
| 34 | + |
| 35 | +**Peor caso:** `O(log *i*)` donde `*i* = índice` (posición) del objetivo |
| 36 | + |
| 37 | +**Mejor caso:** `O(*1*)` |
| 38 | + |
| 39 | +#### Explicación de complejidad |
| 40 | + |
| 41 | +- La complejidad de la primera parte del algoritmo es **`O( log *i* )`** porque si *i* es la posición del destino en la matriz, después de duplicar la búsqueda *index* `⌈log(i)⌉` veces, el algoritmo estará en un índice de búsqueda que es mayor o igual que *i*. Podemos escribir `2^⌈log(i)⌉ >= i` |
| 42 | +- La complejidad de la segunda parte del algoritmo también es **`O ( log *i* )`** porque se trata de una simple búsqueda binaria. La complejidad de búsqueda binaria ( como se explica [aquí](https://github.com/faridevnz/Algorithms-Explicación/blob/master/en/Search%20Algorithms/Binary%20Search.md) ) es `O(*n*)` donde *n* es la longitud de la matriz. En la búsqueda exponencial, la longitud de la matriz en la que se aplica el algoritmo es `2^i - 2^(i-1)`, en palabras significa `(la longitud de la matriz de principio a *i* ) - (la parte de matriz omitida hasta la iteración anterior)`. Es simple verificar que `2^i - 2^(i-1) = 2^(i-1)`. |
| 43 | + |
| 44 | +Después de esta explicación detallada, podemos decir que la complejidad de la búsqueda exponencial es: |
| 45 | + |
| 46 | +```mathematica |
| 47 | +O(log i) + O(log i) = 2O(log i) = O(log i) |
| 48 | +``` |
| 49 | + |
| 50 | +#### Búsqueda binaria vs Búsqueda exponencial |
| 51 | + |
| 52 | +Echemos un vistazo a esta comparación con un ejemplo menos teórico. Imagine que tenemos una matriz con elementos `1_000_000` y queremos buscar un elemento que esté en la posición `4th`. Es fácil ver que: |
| 53 | + |
| 54 | +- La búsqueda binaria comienza desde el centro de la matriz y llega a la 4ª posición después de muchas iteraciones |
| 55 | +- La búsqueda exponencial llega al 4º índice después de sólo 2 iteraciones |
| 56 | + |
| 57 | +#### Enlaces de implementación de código |
| 58 | + |
| 59 | +- [C++](https://github.com/TheAlgorithms/C-Plus-Plus/blob/master/search/exponential_search.cpp) |
| 60 | +- [JavaScript](https://github.com/TheAlgorithms/Javascript/blob/master/Search/ExponentialSearch.js) |
0 commit comments