Учитывая, что у меня есть ОГРОМНЫЙ массив и значение из него. Я хочу получить индекс значения в массиве. Есть ли другой способ вместо звонка, Array#index
чтобы получить его? Проблема возникает из-за необходимости хранить действительно огромный массив и вызывать Array#index
огромное количество раз.
После пары попыток я обнаружил, что кеширование индексов внутри элементов путем сохранения структур с (value, index)
полями вместо самого значения дает огромный скачок в производительности (выигрыш в 20 раз).
Тем не менее, мне интересно, есть ли более удобный способ найти индекс элемента en без кеширования (или есть хороший метод кеширования, который повысит производительность).
ruby
arrays
performance
indexing
милочка
источник
источник
Почему бы не использовать index или rindex?
источник
В других ответах не учитывается возможность многократного перечисления записи в массиве. Это вернет хеш, в котором каждый ключ является уникальным объектом в массиве, а каждое значение представляет собой массив индексов, соответствующих тому, где находится объект:
Это позволяет быстро искать повторяющиеся записи:
источник
Есть ли веская причина не использовать хеш? Поиск по
O(1)
сравнениюO(n)
с массивом.источник
#keys
хэш, который возвращает массив, который я использую. Тем не менее, я мог бы подумать и над своей архитектурой ...Если это отсортированный массив, вы можете использовать алгоритм двоичного поиска (
O(log n)
). Например, расширение класса Array с помощью этой функции:источник
Взяв комбинацию ответа @awa и указанного там комментария, вы можете реализовать «быстрый» индекс и rindex для класса массива.
источник
Если ваш массив имеет естественный порядок, используйте двоичный поиск.
Используйте бинарный поиск.
У двоичного поиска есть
O(log n)
время доступа.Вот шаги по использованию бинарного поиска,
bsearch
для поиска элементов или индексовПример кода
источник
Вы можете использовать двоичный поиск (если ваш массив упорядочен и значения, которые вы храните в массиве, каким-то образом сопоставимы). Чтобы это работало, вам необходимо указать двоичному поиску, должен ли он смотреть «влево» или «вправо» от текущего элемента. Но я считаю, что нет ничего плохого в том, чтобы сохранить время
index
вставки и затем использовать его, если вы получаете элемент из того же массива.источник