La recherche dans un tableau de éléments à l'aide de la recherche binaire prend, dans le pire des cas, le log 2 N itérations car, à chaque étape, nous coupons la moitié de notre espace de recherche. Si, au lieu de cela, nous utilisions la "recherche ternaire", nous réduirions les deux tiers de notre espace de recherche à chaque itération, le pire des cas devrait donc prendre log 3 N < log 2 N itérations ...
Il semble que la recherche ternaire soit plus rapide, alors pourquoi utilisons-nous la recherche binaire?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
Le carré moyen
la source
la source
Réponses:
la source
DCTLib a raison, mais oubliez les calculs une seconde.
Selon votre logique, alors, n -ary devrait être le plus rapide. Mais si vous y réfléchissez, n -ary est exactement égal à une recherche d’itération régulière (il suffit de parcourir la liste 1 par 1, mais dans l’ordre inverse). Tout d'abord, vous sélectionnez le dernier (ou l'avant-dernier) élément de la liste et comparez cette valeur à votre valeur de comparaison. Ensuite, vous supprimez cet élément de votre liste, puis choisissez le dernier élément de la nouvelle liste, qui n'est que l'avant-dernière valeur du tableau. À chaque fois, vous n'élimineriez qu'une valeur à la fois jusqu'à ce que vous trouviez votre valeur.
Au lieu de cela, vous devriez y penser comme ceci: comment puis-je éliminer le plus de valeurs de la liste à chaque itération? Dans une recherche binaire, vous éliminez toujours la moitié de la liste. Dans une recherche ternaire, il est possible (avec 33,33% de chances en réalité) d'éliminer les deux tiers de la liste, mais il est encore plus probable (66,66%) que vous n'éliminiez qu'un tiers de la liste. pour calculer O (n), vous devez regarder le pire des scénarios, qui est 1/3, inférieur à 1/2. À mesure que vous vous rapprochez de n, la situation empire encore davantage.
Non seulement le pire scénario sera amélioré avec la recherche binaire, mais votre temps moyen sera également amélioré. En regardant la valeur attendue (quelle partie de la liste pouvons-nous supprimer en moyenne), nous utilisons cette formule:
(P_lower) x (partie que nous pouvons supprimer si inférieur) + (P_higher) x (partie que nous pouvons supprimer si plus élevé) = E
Pour la recherche binaire, il s’agit de .5x.5 + .5x.5 = .5 (nous supprimons toujours la moitié de la liste). Pour les recherches ternaires, cette valeur est 0,666 x 333 + 0,333 x 666 = 0,44; à chaque étape, nous ne supprimerons probablement que 44% de la liste, ce qui la rend en moyenne moins efficace que la recherche binaire. Cette valeur culmine à 1/2 (la moitié de la liste) et diminue à mesure que vous vous rapprochez de n (itération inverse) et de 0 (itération régulière).
Ok, alors j'ai menti..il y a un peu de math impliquée, mais j'espère que ça aide!
la source
Veuillez noter que l'argument de comparaisons log (N) vs 2 log (N) est basé sur une interprétation naïve de l'algorithme. Si je devais vraiment m'asseoir et écrire ceci dans un assemblage x86, les résultats seraient inversés. Le problème réside dans l'utilisation d'entiers pour les cas de test combinés à un compilateur insuffisamment intelligent qui ne peut pas supprimer les comparaisons redondantes. Réessayez avec des chaînes et une fonction de comparaison de chaînes appropriée, puis codez-la pour appeler la fonction de comparaison une fois par boucle et vous constaterez que la recherche ternaire est encore plus rapide.
la source