Dado que tenho uma matriz ENORME e um valor dela. Eu quero obter o índice do valor na matriz. Existe alguma outra maneira, em vez de ligar Array#index
para pegá-lo? O problema vem da necessidade de manter um array realmente grande e chamar uma Array#index
quantidade enorme de vezes.
Depois de algumas tentativas, descobri que o armazenamento de índices em cache dentro de elementos, armazenando structs com (value, index)
campos em vez do valor em si, dá um grande passo no desempenho (20x vezes a vitória).
Ainda assim, eu me pergunto se há uma maneira mais conveniente de encontrar o índice de um elemento sem cache (ou se há uma boa técnica de cache que aumentará o desempenho).
ruby
arrays
performance
indexing
gmile
fonte
fonte
Por que não usar index ou rindex?
fonte
Outras respostas não levam em consideração a possibilidade de uma entrada listada várias vezes em um array. Isso retornará um hash em que cada chave é um objeto único na matriz e cada valor é uma matriz de índices que corresponde a onde o objeto reside:
Isso permite uma busca rápida por entradas duplicadas:
fonte
Existe um bom motivo para não usar hash? As pesquisas são
O(1)
vs.O(n)
para a matriz.fonte
#keys
hash, que retorna um array que estou usando. Ainda assim, posso pensar sobre minha arquitetura também ...Se for um array ordenado, você pode usar um algoritmo de busca binária (
O(log n)
). Por exemplo, estendendo a classe Array com esta funcionalidade:fonte
Pegando uma combinação da resposta de @ sawa e do comentário listado lá, você poderia implementar um índice "rápido" e rindex na classe de array.
fonte
Se sua matriz tem uma ordem natural, use a pesquisa binária.
Use a pesquisa binária.
A pesquisa binária tem
O(log n)
tempo de acesso.Aqui estão as etapas sobre como usar a pesquisa binária,
bsearch
para encontrar elementos ou índicesExemplo de código
fonte
Você pode usar a pesquisa binária (se o seu array estiver ordenado e os valores armazenados no array forem comparáveis de alguma forma). Para que isso funcione, você precisa saber dizer à pesquisa binária se ela deve estar olhando "para a esquerda" ou "para a direita" do elemento atual. Mas eu acredito que não há nada de errado em armazenar o
index
no momento da inserção e depois usá-lo se você estiver obtendo o elemento do mesmo array.fonte