Dans un tableau, nous devons d'abord déterminer si un nombre désiré existe ou non dans ce tableau. Si non alors comment vais-je trouver plus près du nombre désiré en Java?Recherche du nombre le plus proche dans un tableau
Répondre
Array.indexOf()
pour savoir si l'élément existe ou non. Si ce n'est pas le cas, parcourez un tableau et conservez une variable qui contient la valeur absolue de la différence entre l'élément désiré et i
-th. Renvoie l'élément avec la plus petite différence absolue.
complexité globale est O (2n), qui peut encore être réduite à une seule itération sur un réseau (ce serait O (n)). Cela ne fera pas beaucoup de différence.
Une idée:
int nearest = -1;
int bestDistanceFoundYet = Integer.MAX_INTEGER;
// We iterate on the array...
for (int i = 0; i < array.length; i++) {
// if we found the desired number, we return it.
if (array[i] == desiredNumber) {
return array[i];
} else {
// else, we consider the difference between the desired number and the current number in the array.
int d = Math.abs(desiredNumber - array[i]);
if (d < bestDistanceFoundYet) {
// For the moment, this value is the nearest to the desired number...
bestDistanceFoundYet = d; // Assign new best distance...
nearest = array[i];
}
}
}
return nearest;
Vous devez encore assigner d à bestDistanceFound - ce test pensera que chaque chiffre est meilleur, et retournera le dernier élément du tableau indépendamment. –
@Pax> Oui en effet. Je serai plus prudent la prochaine fois ... – romaintaz
ce n'était pas exactement mes devoirs mais j'ai dû implémenter cette fonctionnalité dans une simulation d'ascenseur en utilisant un schéma de stratégie. Cela a aidé beaucoup! –
Si le tableau est trié, puis effectuez une recherche binaire modifiée. Fondamentalement, si vous ne trouvez pas le nombre, alors à la fin de la recherche, retournez la limite inférieure.
Il manque seulement la sémantique de plus proche.
Que faites-vous si vous cherchez six et votre tableau a quatre et huit?
Lequel est le plus proche?
Trick question, la réponse est sept! – ArtOfWarfare
Pseudocode pour renvoyer la liste des entiers les plus proches.
myList = new ArrayList();
if(array.length==0) return myList;
myList.add(array[0]);
int closestDifference = abs(array[0]-numberToFind);
for (int i = 1; i < array.length; i++) {
int currentDifference= abs(array[i]-numberToFind);
if (currentDifference < closestDifference) {
myList.clear();
myList.add(array[i]);
closestDifference = currentDifference;
} else {
if(currentDifference==closestDifference) {
if(myList.get(0) !=array[i]) && (myList.size() < 2) {
myList.add(array[i]);
}
}
}
}
return myList;
Une autre définition courante de "plus proche" est basée sur le carré de la différence. Le schéma est similaire à celle fournie par romaintaz, à l'exception que vous souhaitez calculer
long d = ((long)desiredNumber - array[i]);
puis comparer (d * d)
à la distance la plus proche.
Remarqueque j'ai tapé d
comme long
plutôt que int
pour éviter tout débordement, ce qui peut se produire même avec le calcul basé sur la valeur absolue. (Par exemple, pensez à ce qui se passe quand desiredValue
est au moins la moitié de la valeur maximale de 32 bits signé, et le tableau contient une valeur de magnitude correspondante mais signe négatif.)
Enfin, j'écrire la méthode pour retourner l'index de la valeur localisée, plutôt que la valeur elle-même. Dans l'un de ces deux cas:
- lorsque le tableau a une longueur de zéro, et
- si vous ajoutez un paramètre « tolérance » qui limite la différence maximale vous considérer comme un match,
vous pouvez utiliser -1
comme une valeur hors bande similaire à la spécification sur indexOf
.
@Pete Kirkham: Cela fonctionne maintenant. –
int d = Math.abs(desiredNumber - array[i]);
if (d < bestDistanceFoundYet) {
// For the moment, this value is the nearest to the desired number...
nearest = array[i];
}
De cette façon, vous trouvez le dernier numéro plus proche de nombre souhaité car bestDistanceFoundYet est constant et d mémoriser la dernière valeur passign si le (d < ...).
Si vous souhaitez trouver le plus proche numéro avec n'importe quelle distance par le nombre désiré (d n'est pas important), vous pouvez mémoriser la dernière valeur possible. Au cas vous pouvez tester
if(d<last_d_memorized){ //the actual distance is shorter than the previous
// For the moment, this value is the nearest to the desired number...
nearest = array[i];
d_last_memorized=d;//is the actual shortest found delta
}
int[] somenumbers = getAnArrayOfSomenumbers();
int numbertoLookFor = getTheNumberToLookFor();
boolean arrayContainsNumber =
new HashSet(Arrays.asList(somenumbers))
.contains(numbertoLookfor);
Il est rapide aussi.
Oh - vous vouliez trouver le numéro le plus proche? Dans ce cas:
int[] somenumbers = getAnArrayOfSomenumbers();
int numbertoLookFor = getTheNumberToLookFor();
ArrayList<Integer> l = new ArrayList<Integer>(
Arrays.asList(somenumbers)
);
Collections.sort(l);
while(l.size()>1) {
if(numbertoolookfor <= l.get((l.size()/2)-1)) {
l = l.subList(0, l.size()/2);
}
else {
l = l.subList(l.size()/2, l.size);
}
}
System.out.println("nearest number is" + l.get(0));
Oh-accrocher: vous étiez après une solution des moindres carrés?
Collections.sort(l, new Comparator<Integer>(){
public int compare(Integer o1, Integer o2) {
return (o1-numbertoLookFor)*(o1-numbertoLookFor) -
(o2-numbertoLookFor)*(o2-numbertoLookFor);
}});
System.out.println("nearest number is" + l.get(0));
Quelques choses à signaler:
1 - Vous pouvez convertir le tableau à une liste à l'aide
Arrays.asList(yourIntegerArray);
2 - À l'aide d'une liste, vous pouvez simplement utiliser indexOf().
3 - Considérons un scénario où vous avez une liste d'une certaine longueur, vous voulez que le nombre le plus proche de 3, vous avez déjà trouvé que 2 est dans le tableau, et vous savez que 3 ne l'est pas. Sans vérifier les autres chiffres, vous pouvez sans risque conclure que 2 est le meilleur, parce qu'il est impossible d'être plus proche. Je ne suis pas sûr de savoir comment indexOf() fonctionne, cependant, cela ne peut pas vous accélérer.
4 - En se développant sur 3, disons que indexOf() ne prend pas plus de temps que d'obtenir la valeur à un index. Ensuite, si vous voulez que le nombre le plus proche de 3 dans un tableau et vous avez déjà trouvé 1, et avez beaucoup plus de nombres à vérifier, alors il sera plus rapide de simplement vérifier si 2 ou 4 est dans le tableau.
5 - Expansion sur 3 et 4, je pense qu'il pourrait être possible d'appliquer à double et flotteurs, mais il faudrait que vous utilisez une taille de pas inférieure à 1 ... calculer le petit semble au-delà de la portée de la question, cependant.
// paulmurray's answer to your question is really the best :
// The least square solution is way more elegant,
// here is a test code where numbertoLookFor
// is zero, if you want to try ...
import java.util.* ;
public class main {
public static void main(String[] args)
{
int[] somenumbers = {-2,3,6,1,5,5,-1} ;
ArrayList<Integer> l = new ArrayList<Integer>(10) ;
for(int i=0 ; i<somenumbers.length ; i++)
{
l.add(somenumbers[i]) ;
}
Collections.sort(l,
new java.util.Comparator<Integer>()
{
public int compare(Integer n1, Integer n2)
{
return n1*n1 - n2*n2 ;
}
}
) ;
Integer first = l.get(0) ;
System.out.println("nearest number is " + first) ;
}
}
// Cela fonctionne
public int nearest(int of, List<Integer> in)
{
int min = Integer.MAX_VALUE;
int closest = of;
for (int v : in)
{
final int diff = Math.abs(v - of);
if (diff < min)
{
min = diff;
closest = v;
}
}
return closest;
}
Magnifique, et exactement ce dont j'avais besoin! :) – Ginchen
Merci Ginchen. –
- 1. arrondir le nombre à 0.2 le plus proche avec PHP
- 2. Trouver l'index utilisé le plus proche avant un index spécifié dans un tableau (Rapide)
- 3. Comment arrondir un nombre dans VBA au 5 le plus proche? (ou 10 ou X)
- 4. Arrondi au 100 le plus proche
- 5. JQuery le plus proche() aider
- 6. Aligner sur le marqueur le plus proche
- 7. Trouver le serveur le plus proche dans le réseau
- 8. Arrondir la valeur au nombre entier le plus proche dans SQL MISE À JOUR
- 9. élément le plus proche par id
- 10. Algorithme d'interpolation du plus proche voisin dans MATLAB
- 11. obtenir le résultat le plus proche dans IFNULL
- 12. jQuery ID le plus proche de ma liste
- 13. Comment arrondir à 0.5 le plus proche?
- 14. jquery le plus proche() en sélectionnant
- 15. tour à .25 le plus proche javascript
- 16. Rechercher la valeur la plus proche dans un tableau de doubles en C++?
- 17. convertir un nombre entier dans un tableau
- 18. Comment trouver l'arbre le plus proche d'un autre arbre?
- 19. Arrondir au plus proche cinq
- 20. Expression régulière: trouver un nombre proche d'une chaîne donnée
- 21. Recherche du nombre manquant entre les tables dans SQL
- 22. Comment router vers le serveur RMI le plus proche?
- 23. Arrondi au plus proche Ending Digits
- 24. Comment déterminez-vous le nombre d'éléments définis dans un tableau?
- 25. Chaîne de recherche dans NSMutableArray pour l'affichage dans le tableau
- 26. Tri des résultats de recherche tableau par nombre de correspondances?
- 27. Utilisation de la commande la plus proche du succès dans le callback ajax
- 28. Comment conserver un certain nombre d'éléments dans un tableau?
- 29. Vendeur itinérant - le plus proche voisin vs génétique DEATHMATCH
- 30. Comment contourner un flottant jusqu'à l'int le plus proche en C#?
-1 Il n'y a pas une telle chose comme O (2n). C'est en marche). Je vous renvoie à http://stackoverflow.com/questions/487258/plain-english-explanation-of-big-o/487278#487278 – cletus
Pas besoin de répéter deux fois. – Nrj
Je le sais. Mais la constante devant _n_ peut parfois faire une grande différence dans un algorithme par ailleurs linéaire-complexe. –