Pourquoi Binary Search est-il un algorithme de division et de conquête?
M'a demandé si un Binaire de Recherche est un diviser et conquérir de l'algorithme à un examen. Ma réponse est oui, parce que vous avez divisé le problème en petits sous-problèmes, jusqu'à ce que vous avez atteint votre résultat.
Mais la examinators demandé où était la conquête de la partie a, que j'ai été incapable de répondre. Ils ont également désapprouvé que c'était en réalité une division et de conquête de l'algorithme.
Mais partout où je vais sur le web, il est dit que c'est, donc, je voudrais savoir pourquoi, et où le conquérir une partie de ce qu'il est?
source d'informationauteur Kenci
Vous devez vous connecter pour publier un commentaire.
Le livre
Dit qu'un D&C, l'algorithme doit avoir deux disjoints appels récursifs. I. e comme QuickSort. Binaire de Recherche n'ont pas cela, même si cela peut être mis en œuvre de manière récursive, donc je suppose que c'est la réponse.
Je pense qu'il n'est pas de diviser et conquérir, voir le premier paragraphe de http://en.wikipedia.org/wiki/Divide_and_conquer_algorithm
En binaire de recherche, il n'y a toujours qu'un seul problème qui n'est juste à la réduction des données par moitié à chaque étape, donc pas de la conquête (de fusion) de la phase des résultats est nécessaire.
Dans un fossé et de la conquête de la stratégie :
1.Le problème est divisé en deux parties;
2.Chacune de ces parties est attaqué/résolu de façon indépendante, par application de l'algorithme à la main (surtout la récursivité est utilisée à cette fin) ;
3.Et puis les solutions de chaque partition/division et combinée/fusionnés ensemble pour arriver à la solution finale au problème dans son ensemble (en vertu de conquérir)
Exemple, tri Rapide, de fusion et de tri.
Fondamentalement, le binaire de l'algorithme de recherche juste en divisant son espace de travail(input (ordonnée) tableau de taille n) en deux à chaque itération. Par conséquent, il est certainement le déploiement de la diviser stratégie et, par conséquent, la complexité du temps se réduit à O(lg n).Donc,ce couvre jusqu'à la "fracture" de la partie.
Comme on peut le constater, la solution finale est obtenue à partir de la dernière comparaison, que, lorsque nous sommes à gauche avec un seul élément de comparaison.
Binaire de recherche ne permet pas de fusionner ou de combiner solution.
En bref, la recherche binaire divise la taille de la problème (sur lequel il doit travailler) en deux, mais ne trouve pas le solution en morceaux et donc aucun besoin de la fusion de la solution de se!
Je sais que c'est un peu trop longue, mais j'espère que cela aide 🙂
Vous pouvez également obtenir une certaine idée de : https://www.khanacademy.org/computing/computer-science/algorithms/binary-search/a/running-time-of-binary-search
Aussi, je réalise seulement maintenant que cette question a été posté depuis longtemps de retour!
Mon mauvais!
La fracture de la partie bien sûr, est de diviser le jeu en deux.
La conquête de la partie est de déterminer si, et dans quelle position dans la partie traitée il y a un élément recherché.
Apparemment, certaines personnes considèrent que les binaires de recherche un divide-and-conquer algorithme, et certains ne le sont pas. J'ai rapidement cherché sur google trois références (tous semblent liées à l'enseignement universitaire) qui appellent à la une D&C algorithme:
http://www.cs.berkeley.edu/~vazirani/algorithmes/chap2.pdf
http://homepages.ius.edu/rwisman/C455/html/notes/Chapter2/DivConq.htm
http://www.csc.liv.ac.uk/~ped/teachadmin/algor/d_and_c.html
Je pense que c'est d'un commun accord qu'un D&C, l'algorithme doit avoir au moins les deux premières phases de ces trois:
La deuxième phase - la conquête - de manière récursive doit appliquer la même technique à résoudre le subproblem en le divisant en même petits sous-sous-problèmes, et etc. Dans la pratique, cependant, souvent d'un certain seuil est utilisé pour limiter l'approche récursive, comme pour les petits problèmes de taille d'une approche différente pourrait être plus rapide. Par exemple, le tri rapide implémentations souvent utiliser par exemple de tri à bulles lorsque la taille d'un tableau portion de trier devient petit.
La troisième phase pourrait être un no-op, et à mon avis il ne pas disqualifier un algorithme de D&C. Un exemple courant est récursive de la décomposition d'un
for
-boucle avec toutes les itérations de travail purement indépendant des éléments de données (c'est à dire pas de réduction de toute forme). Il pourrait sembler inutile au premier abord, mais en fait, c'est moyen très puissant de par exemple, exécuter la boucle en parallèle, et utilisé par les cadres tels que Cilk et Intel TBB.Revenir à la question initiale: prenons un peu de code qui implémente l'algorithme (j'utilise C++; désolé si ce n'est pas la langue que vous êtes à l'aise avec):
Ici le clivage de la partie est
int m = (begin+end)/2;
et tout le reste, c'est la conquête de la partie. L'algorithme est explicitement écrit dans récursive de D&C, même si seulement l'une des branches est pris. Cependant, il peut aussi être écrit dans une forme de boucle:Je pense que c'est plutôt une voie commune pour mettre en œuvre une recherche binaire avec une boucle; j'ai délibérément utilisé les mêmes noms de variables comme dans le récursive exemple, de sorte que les éléments communs, c'est plus facile à voir. Par conséquent, nous pourrions dire que, encore une fois, le calcul du point central est la fracture de la partie, et le reste du corps de la boucle est la conquête de la partie.
Mais bien sûr, si votre examinateurs de penser différemment, il peut être difficile de les convaincre qu'il est D&C.
Mise à jour: juste eu une pensée que si je devais développer un squelette générique de la mise en œuvre d'un D&C algorithme, je serais certainement utiliser les binaires de recherche comme l'une des API de la pertinence des tests pour vérifier si l'API est suffisamment puissant concis. Bien sûr, il ne prouve rien 🙂
Binaire de recherche est difficile à décrire avec la plus divide-and-conquer parce que la conquête de l'étape n'est pas explicite. Le résultat de l'algorithme est l'indice de l'aiguille dans la botte de foin, et un pur D&C la mise en œuvre serait de retour à l'index de l'aiguille dans la plus petite botte de foin (
0
dans un élément de liste) et puis, de manière récursive ajouter les décalages dans les grandes meules de foin qui ont été répartis de la division de l'étape.Pseudocode pour expliquer:
Le plus (
0 +
ousize of lower half
) est la conquête de la partie. La plupart des gens sauter en fournissant des indices dans une plus grande liste des arguments, et il est donc souvent pas facilement disponibles.Un bon diviser et conquérir de l'algorithme nécessite à la fois des pièces à traiter.
Par conséquent, beaucoup de gens vont pas appel binaire de recherche d'un fossé et de la conquête de l'algorithme, il ne diviser le problème, mais ignore l'autre moitié.
Mais plus probablement, votre examinateurs voulais juste voir comment vous soutiennent. La (bonne) examens ne sont pas sur les faits, mais sur la façon dont vous réagissez quand le problème va au-delà de la matière d'origine.
Donc, à mon humble avis la bonne réponse aurait été:
BTW: il y a une belle variation de QuickSort, appelé QuickSelect, qui exploite effectivement cette différence afin d'obtenir une moyenne de
O(n)
médiane de l'algorithme de recherche. C'est comme QuickSort - mais descend seulement dans la moitié, il est intéressé.Diviser et Conquérir de l'algorithme est basé sur 3 étape comme suit:
De Recherche binaire problème peut être défini comme trouver x dans le tableau trié d'Un[n].
Selon cette information:
En plus de @Kenci postDnC, les algorithmes de quelques généraux/propriétés communes; ils:
Le problème avec le Binaire de Recherche est qu'il ne pas vraiment à même de générer un ensemble de indépendants de sous-instances à être résolus, comme indiqué à l'étape 1, il ne l' simplifie le problème d'origine en définitivement jeter sections, il n'est pas intéressé. En d'autres mots, il ne réduit le problème est de taille et c'est dans la mesure où elle ne va jamais.
Une DnC algorithme est censé non seulement identifier et résoudre le plus petit sous-instances du problème indépendamment les uns des autres, mais aussi utiliser cet ensemble de partiels indépendants des solutions à "construire" une solution unique pour le plus grand problème de l'instance dans son ensemble.
Le livre Fondamentaux de l'AlgorithmiqueG. Brassard, P. Bratley dit ce qui suit (les caractères gras, italiques, italique dans l'original):
Section 7.3 Binaire de Recherche sur p.226.
La définition informelle est plus ou moins: Diviser le problème en petits problèmes. Puis les résoudre et de les mettre ensemble (conquérir). La résolution est en fait de décider où aller (à gauche, à droite, l'élément trouvé).
Ici une citation de wikipedia:
Cette les etats, c'est PAS [mise à jour: mal lu cette phrase:)] une partie seulement de diviser pour régner.
Mise à jour:
Cette article fait clair pour moi. J'étais confus, depuis la définition dit que vous avez à résoudre chaque sous-problème. Mais vous avez résolu le sous problème si vous savez que vous n'avez pas à garder sur la recherche..
Le Binaire de Recherche est un diviser et conquérir de l'algorithme:
1) À Diviser et Conquérir des algorithmes, nous essayons de résoudre un problème par la résolution d'un plus petit sous-problème (Fracture de la partie) et l'utilisation de la solution pour construire la solution pour notre plus grand problème(Conquérir).
2) Voici notre problème est de trouver un élément dans le tableau trié. Nous pouvons le résoudre par la résolution d'un semblable sous-problème. (Nous sommes sur la création de sous problèmes ici fondée sur une décision que l'élément recherché est plus petit ou plus grand que le milieu de l'élément). Ainsi, une fois que nous savons que l'élément ne peut pas exister sûrement dans une moitié, nous avons à résoudre un semblable sous-problème dans l'autre moitié.
3) de Cette façon, nous recurse.
4) La conquête de la partie ici est de simplement retourner la valeur renvoyée par le sous-problème pour le haut de l'arborescence récursive
Dichotomique en informatique se réfère à choisir entre deux antithétique choix entre deux options distinctes. Une dichotomie est toute division d'un entier dans exactement deux non-cumul des pièces, c'est à dire une procédure dans laquelle l'ensemble est divisé en deux parties. C'est une partition de l'ensemble (ou un ensemble) en deux parties (sous-ensembles) qui sont:
1. Conjointement Exhaustive: tout doit appartenir à l'une ou l'autre partie, et
2. Mutuellement Exclusives: rien ne peut appartenir simultanément aux deux parties.
Diviser et conquérir des œuvres de manière récursive à décomposer un problème en deux ou plusieurs sous-problèmes du même type, jusqu'à ce que ceux-ci deviennent assez simple pour être résolu directement.
De sorte que le binaire de recherche de moitié le nombre des éléments à vérifier à chaque itération et détermine si elle a une chance de localisation de la "clé" dans que la moitié ou de passer à l'autre moitié s'il est en mesure de déterminer les clés de l'absence. Comme l'algorithme est dichotomique dans la nature de sorte que le binaire de recherche vont croire que les "clés" doit être dans une partie jusqu'à ce qu'il atteigne la sortie de la condition où il renvoie que la clé est manquante.
Je pense que c'est de Diminuer et de Conquérir.
Voici une citation de wikipedia.
http://en.wikipedia.org/wiki/Divide_and_conquer_algorithms#Decrease_and_conquer
Selon ma compréhension, "Conquérir" partie est à la fin lorsque vous trouvez l'élément cible de la recherche Binaire. La "Diminution" de la partie est de réduire l'espace de recherche.
De Recherche binaire et Ternaire Algorithmes de Recherche sont basés sur la Diminution et la Conquête de la technique. Parce que, vous ne divisez pas le problème, en fait, de réduire le problème en divisant par 2(3 en ternaire de recherche).
De fusion de Tri et Rapide des Algorithmes de Tri peuvent être donnés comme exemples de " Diviser et Conquérir technique. Vous diviser le problème en deux sous-problèmes et l'utilisation de l'algorithme pour ces sous-problèmes à nouveau pour trier un tableau. Mais, vous jetez la moitié de tableau dans la recherche binaire. Cela signifie que vous DIMINUEZ la taille de la matrice, et non pas diviser.
Non, la recherche binaire n'est pas de diviser et conquérir. Oui, binaire de recherche est de diminuer et de conquérir. Je crois que diviser et conquérir les algorithmes ont une efficacité de O(n log(n)) alors que de la diminution et de conquérir les algorithmes ont une efficacité de O(log(n)). La différence étant de savoir si ou non vous avez besoin pour évaluer les deux parties de la répartition des données ou pas.