Étant donné un bitonic tableau et de l'élément x dans le tableau, trouver l'indice de x dans 2log(n) le temps
Tout d'abord, un bitonic tableau pour cette question est définie comme un tel que, pour tout indice K
dans un tableau de longueur N
où 0 < K < N - 1
et de 0 à K est monotone croissante de la séquence de nombres entiers, et K à N - 1 est une façon monotone décroissante de la séquence de nombres entiers.
Exemple: [1, 3, 4, 6, 9, 14, 11, 7, 2, -4, -9]
. Il augmente de façon monotone de 1 à 14 ans, puis diminue à partir de 14 à -9.
Le précurseur de cette question est de résoudre dans 3log(n)
, qui est beaucoup plus facile. Une altération de la recherche binaire pour trouver l'index de max, puis deux binaires des recherches de 0 à K et K + 1 à N - 1, respectivement.
Je suppose que la solution dans 2log(n)
vous demande de résoudre le problème sans trouver de l'index max. J'ai pensé recouvrent les binaires de recherche, mais au-delà, je ne suis pas sûr de savoir comment aller de l'avant.
Toutefois, si le milieu n'était pas le max, il est possible que les deux binaires recherches convergent vers un seul côté, ce qui signifie que l'on serait redondant. Dans ce cas, nous devons forcer l'un des binaires de recherche l'autre sens jusqu'à ce qu'il fonctionne de lui-même et ne se déplace pas vers l'autre en binaire de recherche. Je pense que ce serait la façon d'aller à ce sujet.
Comment fonctionne la recherche pour le max de travail à exactement log n sans facteur constant de toute façon?
flexaired.blogspot.com/2013/06/...
OriginalL'auteur David | 2013-10-15
Vous devez vous connecter pour publier un commentaire.
Les algorithmes présentés dans les autres réponses (cette et cette) sont malheureusement incorrecte, ils ne sont pas en O(logN) !
La formule récursive f(L) = f(L/2) + log(L/2) + c ne conduit pas à f(L) = O(log(N)), mais conduit à f(L) = O((log(N))^2) !
En effet, supposons k = log(L), alors log(2^(k-1)) + log(2^(k-2)) + ... + log(2^1) = log(2)*(k-1 + k-2 + ... + 1) = O(k^2). Par conséquent, log(L/2) + log(L/4) + ... + log(2) = O((log(L)^2)).
La bonne façon de résoudre le problème dans le temps ~ 2log(N) est de procéder comme suit (en supposant que le tableau est premier dans l'ordre croissant, puis dans l'ordre décroissant):
Dans le dernier cas, il peut être surprenant de faire une recherche binaire sur un subarray qui peuvent être bitonic mais il fonctionne réellement, car nous savons que les éléments qui ne sont pas dans le bon de commande sont tous plus grand que la valeur souhaitée. Par exemple, en faisant un croissant de recherche binaire pour la valeur 5 dans le tableau [2, 4, 5, 6, 9, 8, 7] va travailler parce que les 7 et 8 sont plus grandes que la valeur souhaitée 5.
Ici est un travail entièrement mise en œuvre (en C++) de la bitonic de recherche dans le temps ~2logN:
absolument ! J'ai édité le post et a remplacé "dichotomic_search' par 'binary_search" pour être cohérent avec l'explication.
Pouvez-vous expliquer votre relation de récurrence.
L'hypothèse à la recherche binaire ne fonctionne pas? Dire que le tableau d'entiers
[2, 4, 5, 6, 9, 8, 1]
?Un (personnalisé) binaire de recherche travaille aussi longtemps que les valeurs se répartissent autour cherché valeur.Nous avons en effet impossible d'utiliser un std (
std::binary_search
oustd::lower_bound
) car il sera UB.OriginalL'auteur user3017842
L'algorithme fonctionne de manière récursive en combinant bitonic et binaires de recherche:
De sorte que la formule récursive pour le moment est
f(l) = f(l/2) + log(l/2) + c
oùlog(l/2)
vient de la recherche binaire etc
est le coût de la comparaison faite dans le corps de la fonction.Je ne suis pas familier avec bitonic de recherche, donc, je dois demander: sont
&
et|
opérations binaires ou une abréviation pour désigner&&
et||
?oui, ce sont les opérations logiques
and
etor
(c'est pseudocode)OriginalL'auteur sds
où DownSearch est
et BinarySearch est
github
OriginalL'auteur Denis Larionov
Trouver le changement de signe entre le premier ordre différences, par standard dichotomique de recherche, prendra
2Lg(n)
accès à des tableaux.Vous pouvez faire un peu mieux à l'aide de la stratégie de recherche de la valeur maximale d'un unimodale fonction dite de Fibonacci de recherche. Après n étapes, chacune impliquant une seule recherche, vous réduisez l'intervalle de la taille par un facteur
Fn
, correspondant à environLog n/Log φ ~ 1.44Lg(n)
accède à trouver le maximum.Ce gain marginal fait un peu plus de sens lorsque l'accès à des tableaux sont plutôt coûteux d'une fonction d'évaluations.
OriginalL'auteur Yves Daoust
Réponses à celles fournies avoir le temps de la complexité de (N/2)*logN. Parce que le pire des cas, peut inclure trop de sous-recherches qui sont inutiles. Une modification est à comparer à la valeur cible à gauche et à droite de l'élément de la sous-série avant la recherche. Si la valeur cible n'est pas entre les deux extrémités de la monotone de la série ou du moins que les deux extrémités de la bitonic de la série, à la suite de la recherche est redondante. Cette modification conduit à 2lgN complexité.
OriginalL'auteur Bravo
Il y a 5 principaux cas selon l'endroit où le max élément du tableau est, et si le milieu de l'élément est supérieure à la valeur désirée
Calculer milieu de l'élément.
Comparer milieu de l'élément valeur désirée, si elle correspond à la recherche se termine. Sinon, passez à l'étape suivante.
Comparer milieu de l'élément avec les voisins pour voir si max élément est sur la gauche ou la droite. Si les deux voisins sont à moins de moyen de l'élément, puis l'élément n'est pas présent dans la table, donc la sortie.(Tableau mentionné dans la question va frapper ce cas, d'abord comme 14, le max élément, est en moyenne)
Si le milieu de l'élément est inférieure à la valeur désirée et max élément est sur la droite, ne bitonic de recherche en droit subarray
Si le milieu de l'élément est inférieure à la valeur désirée et max élément est sur la gauche, ne bitonic de recherche à gauche subarray
Si le milieu de l'élément est supérieure à la valeur désirée et max élément est sur la gauche, l'ordre décroissant binaire de recherche en droit subarray
Si le milieu de l'élément est supérieure à la valeur désirée et max élément est sur la droite, ne croissant binaire de recherche à gauche subarray
Dans le pire des cas, nous allons faire deux comparaisons à chaque fois tableau est divisé en deux, d'où la complexité sera de 2*logN
OriginalL'auteur Manohar Bhat
Un binaire split, il y a trois cas:
attention: la recherche binaire utilisé à gauche et à droite sont différentes en raison de l'augmentation/la diminution de l'ordre.
max item stands at the split point exactly
trompeuse commentaireOriginalL'auteur Dongliang Yu