Étant donné que j'ai un tableau ÉNORME, et une valeur de celui-ci. Je veux obtenir l'index de la valeur dans le tableau. Y a-t-il un autre moyen, plutôt que d'appeler Array#index
pour l'obtenir? Le problème vient de la nécessité de conserver un tableau vraiment énorme et d'appeler Array#index
énormément de fois.
Après quelques essais, j'ai trouvé que la mise en cache des index à l'intérieur des éléments en stockant des structures avec des (value, index)
champs au lieu de la valeur elle-même donne un énorme pas en avant dans les performances (20x fois gagnant).
Je me demande toujours s'il existe un moyen plus pratique de trouver l'index d'un élément sans mise en cache (ou s'il existe une bonne technique de mise en cache qui améliorera les performances).
la source
Pourquoi ne pas utiliser index ou rindex?
la source
D'autres réponses ne prennent pas en compte la possibilité d'une entrée répertoriée plusieurs fois dans un tableau. Cela retournera un hachage où chaque clé est un objet unique dans le tableau et chaque valeur est un tableau d'indices qui correspond à l'endroit où se trouve l'objet:
Cela permet une recherche rapide des entrées en double:
la source
Y a-t-il une bonne raison de ne pas utiliser de hash? Les recherches sont
O(1)
contreO(n)
le tableau.la source
#keys
le hachage, qui renvoie un tableau que j'utilise. Pourtant, je pourrais aussi réfléchir à mon architecture ...S'il s'agit d'un tableau trié , vous pouvez utiliser un algorithme de recherche binaire (
O(log n)
). Par exemple, étendre la classe Array avec cette fonctionnalité:la source
En combinant la réponse de @ sawa et le commentaire qui y est listé, vous pouvez implémenter un index "rapide" et un rindex sur la classe du tableau.
la source
Si votre tableau a un ordre naturel, utilisez la recherche binaire.
Utilisez la recherche binaire.
La recherche binaire a
O(log n)
un temps d'accès.Voici les étapes à suivre pour utiliser la recherche binaire,
bsearch
pour rechercher des éléments ou des indicesExemple de code
la source
Vous pouvez utiliser la recherche binaire (si votre tableau est ordonné et que les valeurs que vous stockez dans le tableau sont comparables d'une certaine manière). Pour que cela fonctionne, vous devez être capable de dire à la recherche binaire si elle doit regarder "à gauche" ou "à droite" de l'élément courant. Mais je pense qu'il n'y a rien de mal à stocker le
index
au moment de l'insertion, puis à l'utiliser si vous obtenez l'élément du même tableau.la source