Если вы что-нибудь о порядке данных не знаю, не существует более эффективный алгоритм, это теоретический оптимальный. Вы можете - используя некоторые трюки - сделать это на несколько процентов быстрее. Например:
- кэш длина массива
- выполнить немедленное возвращение вместо того, чтобы
break
(разрывы, когда дело доходит до исполнения, не считаются эффективными, что).
- Использовать
o.equals
вместо arr[i].equals
. Умные компиляторы могут кэшировать vtable
o
.
Но, скорее всего, компилятор уже может получить некоторые из самих оптимизаций.
более эффективный алгоритм, таким образом, вероятно:
public static int findIndex(Object[] arr, Object o) {
int n = arr.length;
for (int i = 0; i < n; i++) {
if (o.equals(arr[i])) {
return i;
}
}
return -1;
}
Хотя разница не будет столь огромным. Если один tests обеих реализаций, разница:
//question first
findIndex (question): 4s 209 469 827
findIndex (answer): 4s 078 955 465
//answer first
findIndex (question): 4s 256 345 171
findIndex (answer): 4s 488 112 895
(есть разница в какой метод вы звоните первым из-за кэширования). Дело в том, что разница не такая огромная и может быть изменена вызовами ОС, другими задачами серверов. Таким образом, можно смело сказать, что мы говорим о миллисекундах в реальной разнице в производительности.
Если, однако, данные приказал (по некоторым отношениям) вы можете выполнить binary search.
Если вы хотите выполнить несколько поисков, вы можете сначала вставить элементы в HashSet<T>
. У этого HashSet<T>
есть средний взгляд на O (1) (с учетом хорошей хэширования).
что вы имеете в виду более эффективным способом? что эффективно для вас? есть ленивая оценка в Java 8, но когда я скамейка отметил это своим подходом, ваш подход был быстрее. –
Позвольте мне перефразировать: метод, который работает быстрее, чем выше! Спасибо – user3749872
Ищите findfirst в Java 8 и сравните его с вашим подходом, вы видите, что ваш быстрее, насколько я тестировал –