J'ai une ArrayList, qui contient des objets de jeu triés par leur position 'Z' (float) de bas en haut. Je ne sais pas si ArrayList est le meilleur choix pour elle, mais je suis venu avec une telle solution pour trouver un indice d'insertion dans une complexité plus rapide que linéaire (pire des cas):Comment insérer rapidement un élément dans un tableau avec des doublons après tous les éléments égaux?
GameObject go = new GameObject();
int index = 0;
int start = 0, end = displayList.size(); // displayList is the ArrayList
while(end - start > 0)
{
index = (start + end)/2;
if(go.depthZ >= displayList.get(index).depthZ)
start = index + 1;
else if(go.depthZ < displayList.get(index).depthZ)
end = index - 1;
}
while(index > 0 && go.depthZ < displayList.get(index).depthZ)
index--;
while(index < displayList.size() && go.depthZ >= displayList.get(index).depthZ)
index++;
Le hic est que l'élément doit être inséré à un endroit spécifique dans la chaîne d'éléments de valeur égale à depthZ - à la fin de cette chaîne. C'est pourquoi j'ai besoin de 2 boucles supplémentaires après la recherche binaire qui je suppose ne sont pas trop chères car la recherche binaire me donne une approximation de cet endroit.
Encore je me demande s'il existe une meilleure solution ou des algorithmes connus pour un tel problème dont je n'ai pas entendu parler? Peut-être utiliser une structure de données différente de ArrayList? Au moment où j'ignore l'insertion de cas le plus défavorable O (n) (en insérant au début ou au milieu) parce que j'utilise une liste normale, je ne serais pas capable de trouver un index à insérer en utilisant la méthode ci-dessus.
Pourquoi ne pas utiliser un 'HashMap' ou quelque chose comme ça, et mapper à chaque valeur, le nombre d'occurrences? –
ah désolé, j'ai oublié de mentionner que les valeurs de depthZ sont flottantes donc il y a juste trop de valeurs possibles – Savail
L'insertion au milieu du tableau est chère, ce qui ne sert à rien de vitesse de recherche binaire. Vous pouvez utiliser 'TreeMap>' pour ce dont vous avez besoin. –