Quelle est la différence entre la recherche linéaire et la recherche binaire?
Une recherche linéaire regarde une liste, élément par élément, sans sauter. En termes de complexité, il s'agit d'une recherche O(n)
- le temps requis pour effectuer une recherche dans la liste augmente au même rythme que la liste.
Un recherche binaire } est lorsque vous commencez avec le milieu d'une liste triée et que vous voyez si c'est supérieur ou inférieur à la valeur recherchée, ce qui détermine si la valeur est dans la première ou la seconde moitié. de la liste. Sautez au milieu de la sous-liste, comparez à nouveau, etc. C’est à peu près ce que les humains recherchent généralement un mot dans un dictionnaire (bien que nous utilisions une meilleure heuristique, évidemment - si vous recherchez un commencer à "M"). En termes de complexité, il s'agit d'une recherche O(log n)
- le nombre d'opérations de recherche augmente plus lentement que la liste, car vous réduisez de moitié "l'espace de recherche" à chaque opération.
A titre d'exemple, supposons que vous cherchiez U dans une liste de lettres A à Z (index 0-25; nous recherchons la valeur à l'indice 20).
Une recherche linéaire demanderait:
list[0] == 'U'
? Non.list[1] == 'U'
? Non.
list[2] == 'U'
? Non.
list[3] == 'U'
? Non.
list[4] == 'U'
? Non.
list[5] == 'U'
? Non.
...list[20] == 'U'
? Oui. Fini.
La recherche binaire demanderait:
Comparez
list[12]
('M') avec 'U': Plus petit, regardez plus loin. (Plage = 13-25)
Comparezlist[19]
('T') avec 'U': Plus petit, regardez plus loin. (Plage = 20-25)
Comparezlist[22]
('W') avec 'U': Plus grand, regardez plus tôt. (Plage = 20-21)
Comparezlist[20]
('U') avec 'U': trouvé le! Fini.
En comparant les deux:
Pensez-y comme à deux manières différentes de trouver votre chemin dans un répertoire. Une recherche linéaire commence au début et lit chaque nom jusqu'à ce que vous trouviez ce que vous cherchez. Une recherche binaire, en revanche, consiste à ouvrir le livre (généralement au milieu), à regarder le nom en haut de la page et à décider si le nom que vous recherchez est plus grand ou plus petit que celui que vous cherchez. cherchez. Si le nom que vous recherchez est plus gros, poursuivez votre recherche dans la partie supérieure du livre de cette façon.
Une recherche linéaire consiste à examiner chaque élément d'une liste de données jusqu'à ce qu'il trouve la cible ou atteigne la fin. Cela se traduit par O(n) performances sur une liste donnée. Une recherche binaire vient avec le préalable que les données doivent être triées. Nous pouvons utiliser ces informations pour réduire le nombre d'éléments à examiner pour trouver notre cible. Nous savons que si nous examinons un élément aléatoire dans les données (disons l'élément central) et que cet élément est supérieur à notre cible, tous les éléments situés à droite de cet élément seront également supérieurs à notre cible. Cela signifie qu'il suffit de regarder la partie gauche des données. En gros, chaque fois que nous cherchons la cible et manquons notre objectif, nous pouvons éliminer la moitié des objets restants. Cela nous donne une complexité de Nice O (log n).
Rappelez-vous simplement que le tri des données, même avec l'algorithme le plus efficace, sera toujours plus lent qu'une recherche linéaire (les algorithmes de tri les plus rapides sont O (n * log n)). Vous ne devez donc jamais trier les données pour effectuer une recherche binaire unique ultérieurement. Toutefois, si vous effectuez de nombreuses recherches (disons au moins O (log n)), il peut être intéressant de trier les données de manière à pouvoir effectuer des recherches binaires. Vous pouvez également envisager d'autres structures de données telles qu'une table de hachage dans de telles situations.
Une recherche linéaire commence au début d'une liste de valeurs et vérifie 1 par 1 afin d'obtenir le résultat recherché.
Une recherche binaire commence au milieu d'un tableau trié et détermine le côté (le cas échéant) de la valeur recherchée. Cette "moitié" de la matrice est ensuite à nouveau recherchée de la même manière, en divisant les résultats en deux par deux.
Assurez-vous de décider si le gain de la recherche binaire plus rapide vaut le coût de garder la liste triée (pour pouvoir utiliser la recherche binaire). C'est à dire. Si vous avez beaucoup d'opérations d'insertion/suppression et que vous n'effectuez qu'une recherche occasionnelle, la recherche binaire peut être au total plus lente que la recherche linéaire.
Essayez ceci: Choisissez un nom aléatoire "Nom, Prénom" et cherchez-le dans votre répertoire.
1ère fois: commencez au début du livre, lisez les noms jusqu'à ce que vous les trouviez, ou trouvez le lieu où cela se serait passé par ordre alphabétique et notez que ce n'est pas là.
2e fois: ouvrez le livre à mi-chemin et regardez la page. Demandez-vous si cette personne est à gauche ou à droite. Quel que soit le choix, prenez ce 1/2 et trouvez-le au milieu. Répétez cette procédure jusqu'à ce que vous trouviez la page où l'entrée devrait se trouver, puis appliquez le même processus aux colonnes ou effectuez une recherche linéaire le long des noms de la page, comme auparavant.
Chronométrez les deux méthodes et faites votre rapport
[considérez également quelle approche est préférable si tout ce que vous avez est une liste de noms, non triés ...]
Une recherche linéaire regarde une liste, un élément à la fois, sans sauter. En termes de complexité, il s’agit d’une recherche O(n) - le temps nécessaire pour effectuer une recherche dans la liste s’allonge au même rythme que la liste.
Une recherche binaire consiste à commencer par le milieu d'une liste triée et à déterminer si elle est supérieure ou inférieure à la valeur recherchée, ce qui détermine si la valeur est dans la première ou la seconde moitié de la liste. Sautez au milieu de la sous-liste, comparez à nouveau, etc. C’est à peu près ce que les humains recherchent généralement un mot dans un dictionnaire (bien que nous utilisions une meilleure heuristique, évidemment - si vous cherchez un "chat", vous ne le ferez pas. commencer à "M"). En termes de complexité, il s'agit d'une recherche O (log n): le nombre d'opérations de recherche augmente plus lentement que la liste, car vous divisez par deux "l'espace de recherche" à chaque opération.
la recherche binaire s'exécute en O(logn) alors que la recherche linéaire s'exécute en O(n) fois; la recherche binaire a donc de meilleures performances
La recherche linéaire, également appelée recherche séquentielle, examine chaque élément en séquence dès le début pour déterminer si l'élément souhaité est présent dans la structure de données. Lorsque la quantité de données est petite, cette recherche est rapide.Son tâche est simple, mais le travail à effectuer est proportionnel à la quantité de données à rechercher. Le fait de doubler le nombre d'éléments doublera le temps nécessaire à la recherche si l'élément souhaité n'est pas présent.
La recherche binaire est efficace pour un plus grand tableau. En cela, nous vérifions l'élément du milieu. Si la valeur est plus grande que ce que nous recherchons, regardez dans la première moitié, sinon, regardez dans la seconde moitié. Répétez cette opération jusqu'à ce que l'élément souhaité soit trouvé. La table doit être triée pour la recherche binaire. Il élimine la moitié des données à chaque itération.Il est logarithmique.
Si nous avons 1000 éléments à rechercher, la recherche binaire prend environ 10 étapes, la recherche linéaire 1000 étapes.
Pour une meilleure compréhension, jetez un œil à mes implémentations de codepen https://codepen.io/serdarsenay/pen/XELWqN
La plus grande différence réside dans la nécessité de trier votre échantillon avant d'appliquer la recherche binaire. Par conséquent, pour la plupart des échantillons de "taille normale" (ce qui signifie être argumenté), la recherche sera plus rapide avec un algorithme de recherche linéaire.
Voici le code javascript, pour html et css et un exemple complet, veuillez vous reporter au lien ci-dessus codepen.
var unsortedhaystack = [];
var haystack = [];
function init() {
unsortedhaystack = document.getElementById("haystack").value.split(' ');
}
function sortHaystack() {
var t = timer('sort benchmark');
haystack = unsortedhaystack.sort();
t.stop();
}
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
function lineerSearch() {
init();
var t = timer('lineerSearch benchmark');
var input = this.event.target.value;
for(var i = 0;i<unsortedhaystack.length - 1;i++) {
if (unsortedhaystack[i] === input) {
document.getElementById('result').innerHTML = 'result is... "' + unsortedhaystack[i] + '", on index: ' + i + ' of the unsorted array. Found' + ' within ' + i + ' iterations';
console.log(document.getElementById('result').innerHTML);
t.stop();
return unsortedhaystack[i];
}
}
}
function binarySearch () {
init();
sortHaystack();
var t = timer('binarySearch benchmark');
var firstIndex = 0;
var lastIndex = haystack.length-1;
var input = this.event.target.value;
//currently point in the half of the array
var currentIndex = (haystack.length-1)/2 | 0;
var iterations = 0;
while (firstIndex <= lastIndex) {
currentIndex = (firstIndex + lastIndex)/2 | 0;
iterations++;
if (haystack[currentIndex] < input) {
firstIndex = currentIndex + 1;
//console.log(currentIndex + " added, fI:"+firstIndex+", lI: "+lastIndex);
} else if (haystack[currentIndex] > input) {
lastIndex = currentIndex - 1;
//console.log(currentIndex + " substracted, fI:"+firstIndex+", lI: "+lastIndex);
} else {
document.getElementById('result').innerHTML = 'result is... "' + haystack[currentIndex] + '", on index: ' + currentIndex + ' of the sorted array. Found' + ' within ' + iterations + ' iterations';
console.log(document.getElementById('result').innerHTML);
t.stop();
return true;
}
}
}
Linear Search
examine les éléments jusqu'à ce qu'il trouve la valeur recherchée.
Efficacité: O(n)
Exemple de code Python:
test_list = [1, 3, 9, 11, 15, 19, 29]
test_val1 = 25
test_val2 = 15
def linear_search(input_array, search_value):
index = 0
while (index < len(input_array)) and (input_array[index] < search_value):
index += 1
if index >= len(input_array) or input_array[index] != search_value:
return -1
return index
print linear_search(test_list, test_val1)
print linear_search(test_list, test_val2)
Binary Search
trouve l'élément du milieu du tableau. Vérifie que la valeur moyenne est supérieure ou inférieure à la valeur de recherche. S'il est plus petit, il obtient le côté gauche du tableau et trouve l'élément central de cette partie. Si c'est plus grand, obtient la bonne partie du tableau. Il boucle l'opération jusqu'à trouver la valeur recherchée. Ou s'il n'y a pas de valeur dans le tableau, la recherche est terminée.
Efficacité: O(logn)
Exemple de code Python:
test_list = [1, 3, 9, 11, 15, 19, 29]
test_val1 = 25
test_val2 = 15
def binary_search(input_array, value):
low = 0
high = len(input_array) - 1
while low <= high:
mid = (low + high) / 2
if input_array[mid] == value:
return mid
Elif input_array[mid] < value:
low = mid + 1
else:
high = mid - 1
return -1
print binary_search(test_list, test_val1)
print binary_search(test_list, test_val2)
Vous pouvez également voir des informations visualisées sur les recherches linéaire et binaire ici: https://www.cs.usfca.edu/~galles/visualization/Search.html