95 lines
2.9 KiB
Markdown
95 lines
2.9 KiB
Markdown
|
---
|
||
|
title: Exponential Search
|
||
|
localeTitle: Búsqueda exponencial
|
||
|
---
|
||
|
## Búsqueda exponencial
|
||
|
|
||
|
La búsqueda exponencial también conocida como búsqueda por dedo, busca un elemento en una matriz ordenada saltando `2^i` elementos en cada iteración donde i representa el valor de la variable de control de bucle, y luego verificar si el elemento de búsqueda está presente entre el último salto y el salto actual
|
||
|
|
||
|
# Peor caso de complejidad
|
||
|
|
||
|
O (log (N)) A menudo confundido por el nombre, el algoritmo se llama así que no por la complejidad del tiempo. El nombre surge como resultado de que el algoritmo salta elementos con pasos iguales a exponentes de 2
|
||
|
|
||
|
# Trabajos
|
||
|
|
||
|
1. Salte los elementos `2^i` la matriz a la vez buscando la condición `Array[2^(i-1)] < valueWanted < Array[2^i]` . Si `2^i` es mayor que la longitud de la matriz, establezca el límite superior a la longitud de la matriz.
|
||
|
2. Haga una búsqueda binaria entre `Array[2^(i-1)]` y `Array[2^i]`
|
||
|
|
||
|
# Código
|
||
|
```
|
||
|
// C++ program to find an element x in a
|
||
|
// sorted array using Exponential search.
|
||
|
#include <bits/stdc++.h>
|
||
|
using namespace std;
|
||
|
|
||
|
int binarySearch(int arr[], int, int, int);
|
||
|
|
||
|
// Returns position of first ocurrence of
|
||
|
// x in array
|
||
|
int exponentialSearch(int arr[], int n, int x)
|
||
|
{
|
||
|
// If x is present at firt location itself
|
||
|
if (arr[0] == x)
|
||
|
return 0;
|
||
|
|
||
|
// Find range for binary search by
|
||
|
// repeated doubling
|
||
|
int i = 1;
|
||
|
while (i < n && arr[i] <= x)
|
||
|
i = i*2;
|
||
|
|
||
|
// Call binary search for the found range.
|
||
|
return binarySearch(arr, i/2, min(i, n), x);
|
||
|
}
|
||
|
|
||
|
// A recursive binary search function. It returns
|
||
|
// location of x in given array arr[l..r] is
|
||
|
// present, otherwise -1
|
||
|
int binarySearch(int arr[], int l, int r, int x)
|
||
|
{
|
||
|
if (r >= l)
|
||
|
{
|
||
|
int mid = l + (r - l)/2;
|
||
|
|
||
|
// If the element is present at the middle
|
||
|
// itself
|
||
|
if (arr[mid] == x)
|
||
|
return mid;
|
||
|
|
||
|
// If element is smaller than mid, then it
|
||
|
// can only be present n left subarray
|
||
|
if (arr[mid] > x)
|
||
|
return binarySearch(arr, l, mid-1, x);
|
||
|
|
||
|
// Else the element can only be present
|
||
|
// in right subarray
|
||
|
return binarySearch(arr, mid+1, r, x);
|
||
|
}
|
||
|
|
||
|
// We reach here when element is not present
|
||
|
// in array
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
int main(void)
|
||
|
{
|
||
|
int arr[] = {2, 3, 4, 10, 40};
|
||
|
int n = sizeof(arr)/ sizeof(arr[0]);
|
||
|
int x = 10;
|
||
|
int result = exponentialSearch(arr, n, x);
|
||
|
(result == -1)? printf("Element is not present in array")
|
||
|
: printf("Element is present at index %d", result);
|
||
|
return 0;
|
||
|
}
|
||
|
```
|
||
|
|
||
|
# Más información
|
||
|
|
||
|
* [Wikipedia](https://en.wikipedia.org/wiki/Exponential_search)
|
||
|
|
||
|
* [GeeksForGeeks](https://www.geeksforgeeks.org/exponential-search/)
|
||
|
|
||
|
|
||
|
# Creditos
|
||
|
|
||
|
[Implementación de C ++](https://www.wikitechy.com/technology/exponential-search/)
|