Recherche de saut
- Algorithme de recherche par saut
- Exemple de recherche par saut
- Mise en œuvre de l’algorithme de recherche par saut
- Complexité de l’algorithme de recherche par saut
La recherche de saut est un algorithme de recherche par intervalle. C’est un algorithme relativement nouveau qui ne fonctionne que sur des tableaux triés. Il tente de réduire le nombre de comparaisons nécessaires par rapport à la recherche linéaire en ne balayant pas chaque élément comme la recherche linéaire. Dans la recherche par saut, le tableau est divisé en blocs m
. Il recherche l’élément dans un bloc et, si l’élément n’est pas présent, il passe au bloc suivant. Lorsque l’algorithme trouve le bloc contenant l’élément, il utilise l’algorithme de recherche linéaire pour trouver l’index exact. Cet algorithme est plus rapide que la recherche linéaire, mais plus lent que la recherche dichotomique.
Algorithme de recherche par saut
Supposons que nous ayons un tableau non trié A[]
contenant n
éléments, et que nous voulons trouver un élément X
.
-
Commencez par le premier ensemble d’éléments
i
comme0
et la taille du blocm
comme√n
. -
Alors que
A[min(m,n)-1]
<X
eti
<n
.- Fixez
i
commem
et augmentezm
par√n
.
- Fixez
-
Si
i
>=n
renvoie-1
. -
Alors que
A[i]
<X
, faites ce qui suit :- incrémentez
i
. - si
i
est égal àmin(m, n)
return-1
- incrémentez
-
Si
A[i]
==X
returni
. -
Sinon, renvoie
-1
.
Exemple de recherche par saut
Supposons que nous ayons le tableau : (1, 2, 3, 4, 5, 6, 7, 8, 9), et que nous voulions trouver X - 7.
Puisqu’il y a 9 éléments, nous avons n
comme 9
.
-
Mettez
i
comme0
etm
comme√9
c’est-à-dire3
. -
A[2]
est plus petit queX
. Mettezi
comme3
etm
comme6
. -
A[5]
est plus petit queX
. Mettezi
comme6
etm
comme9
. -
A[8]
est égal àX
. Sortir de la boucle. -
i
as6
est inférieur àn
. -
A[6]
==7
. Sortez de la boucle -
Puisque
A[6]
==7
, renvoie6
.
Mise en œuvre de l’algorithme de recherche par saut
#include <bits/stdc++.h>
using namespace std;
int jumpSearch(int arr[], int x, int n) {
int m = sqrt(n);
int i = 0;
while (arr[min(m, n) - 1] < x) {
i = m;
m += sqrt(n);
if (i >= n) return -1;
}
while (arr[i] < x) {
i++;
if (i == min(m, n)) return -1;
}
if (arr[i] == x) return i;
return -1;
}
int main() {
int n = 10;
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int x = 7;
int result = jumpSearch(arr, x, n);
if (result == -1)
cout << "Element not found";
else
cout << "Element found at index " << result;
}
Complexité de l’algorithme de recherche par saut
Complexité du temps
- Cas moyen
L’algorithme de tri par saut s’exécute n / m
fois où n
est le nombre d’éléments et m
est la taille du bloc. La recherche linéaire nécessite des comparaisons m-1
faisant l’expression de temps total n / m + m-1
. La valeur la plus optimale de m
minimisant l’expression temporelle est √n
, ce qui rend la complexité temporelle n / √n + √n
, c’est-à-dire √n
. La complexité temporelle de l’algorithme de recherche par sauts est O(√n)
.
- Meilleur cas
Le meilleur cas de complexité temporelle est O(1)
. Elle se produit lorsque l’élément à rechercher est le premier élément présent dans le tableau.
- Pire cas
Le pire cas se produit lorsque nous effectuons des sauts n/m
, et que la dernière valeur que nous avons vérifiée est supérieure à l’élément que nous recherchons, et les comparaisons m-1
sont effectuées pour une recherche linéaire. Le pire cas de complexité temporelle est celui de O(√n)
.
Complexité spatiale
La complexité spatiale de cet algorithme est O(1)
car il ne nécessite aucune structure de données autre que des variables temporaires.
Harshit Jindal has done his Bachelors in Computer Science Engineering(2021) from DTU. He has always been a problem solver and now turned that into his profession. Currently working at M365 Cloud Security team(Torus) on Cloud Security Services and Datacenter Buildout Automation.
LinkedIn