Dado que tengo una ENORME matriz y un valor de ella. Quiero obtener el índice del valor en la matriz. ¿Hay alguna otra forma, en lugar de llamar Array#index
para conseguirlo? El problema proviene de la necesidad de mantener una matriz realmente enorme y llamar una Array#index
gran cantidad de veces.
Después de un par de intentos, descubrí que el almacenamiento en caché de los índices dentro de los elementos almacenando estructuras con (value, index)
campos en lugar del valor en sí da un gran paso en el rendimiento (20 veces más ganado).
Aún así, me pregunto si hay una forma más conveniente de encontrar el índice de un elemento sin almacenamiento en caché (o existe una buena técnica de almacenamiento en caché que aumentará el rendimiento).
fuente
¿Por qué no usar index o rindex?
fuente
Otras respuestas no tienen en cuenta la posibilidad de que una entrada aparezca varias veces en una matriz. Esto devolverá un hash donde cada clave es un objeto único en la matriz y cada valor es una matriz de índices que corresponde al lugar donde vive el objeto:
Esto permite una búsqueda rápida de entradas duplicadas:
fuente
¿Existe una buena razón para no usar un hash? Las búsquedas son
O(1)
vs.O(n)
para la matriz.fuente
#keys
a hash, que devuelve una matriz que estoy usando. Aún así, podría pensar en mi arquitectura también ...Si es una matriz ordenada , puede usar un algoritmo de búsqueda binaria (
O(log n)
). Por ejemplo, ampliando la clase Array con esta funcionalidad:fuente
Tomando una combinación de la respuesta de @ sawa y el comentario que aparece allí, podría implementar un índice "rápido" y un rindex en la clase de matriz.
fuente
Si su matriz tiene un orden natural, utilice la búsqueda binaria.
Utilice la búsqueda binaria.
La búsqueda binaria tiene
O(log n)
tiempo de acceso.Estos son los pasos sobre cómo utilizar la búsqueda binaria,
bsearch
para buscar elementos o índicesEjemplo de código
fuente
Puede usar la búsqueda binaria (si su matriz está ordenada y los valores que almacena en la matriz son comparables de alguna manera). Para que eso funcione, necesita poder decirle a la búsqueda binaria si debe mirar "a la izquierda" o "a la derecha" del elemento actual. Pero creo que no hay nada de malo en almacenar el
index
en el momento de la inserción y luego usarlo si obtiene el elemento de la misma matriz.fuente