Disons que j'ai un tableau de lots de valeurs (C++ de syntaxe, désolé):Aidez-moi à écrire une recherche binaire pour les valeurs limites (extraction des listes de sous)
vector<double> x(100000);
Ce tableau est trié telle que x[n] > x[n-1]
.
Je voudrais qu'une fonction récupère un tableau de toutes les valeurs dans la plage [a, b] (c'est inclus). Certains comme l'interface:
void subarray(const double a, const double b, vector<double> &sub) {
...
}
Lorsque cette fonction est terminée, sub
contiendra les n
valeurs qui sont tombées dans l'intervalle [a, b].
Bien sûr une recherche linéaire est facile:
void subarray(const double a, const double b, vector<double> &sub) {
for (size_t i = 0; i < data.size(); i++) {
if (a <= data[i] && data[i] <= b) {
sub.push_back(data[i]);
}
}
}
Cependant, parce que data
est triée, je devrais être en mesure de le faire en utilisant beaucoup plus rapidement une recherche binaire. Qui veut prendre un coup de couteau? Toute langue est autorisée!
Pouvez-vous être précis là où je prête à confusion? J'aimerais résoudre la question. Merci beaucoup pour votre solution - je n'étais pas au courant de lower_bound et upper_bound. –
D'abord, il est étrange que vous mélangez des ints et des doubles. Ensuite, il n'est pas clair si les plages que vous indiquez sont inclusives ou exclusives. (Une bonne pratique est des gammes asymétriques.) Étant donné l'élégance de la réponse si vous modifiez la question, veuillez le faire de manière à ce que la réponse soit correcte :-) –
Je vois votre confusion, mais pn est juste un pointeur vers un int la longueur du sous-tableau (voir la définition du sous-tableau linéaire). Pas de soucis, votre solution est assez élégante. Je l'utilise maintenant avec succès. –