Какой массив / объект коллекции наиболее эффективен для функции «содержит»?

1

Пожалуйста, простите паршивый титул.

У меня есть список около 430 статических "зарезервированных слов", каждый длиной от 2 до 20 символов. Иногда выполняется процесс в приложении, который требует проверки (потенциально десятков) тысяч строк против этого набора зарезервированных слов, чтобы убедиться, что все они действительны.

Является ли объект Java наиболее подходящим для этого требования? Возможно, это отсортировано?

Теги:
arrays

1 ответ

3

Если вы хотите использовать стандартный объект, используйте HashSet. Он имеет O (1) время доступа в идеальном случае. Он может деградировать, если есть столкновения (теоретически с O (n)). Поскольку вы знаете набор строк заранее, вы можете немного поиграть с коэффициентом нагрузки, чтобы минимизировать столкновения. Теоретически вы также можете предоставить пользовательскую хеш-функцию, обернув строки в пользовательский объект (что позволит вам оптимизировать функцию для распределения строк). Но если ваши струны каким-то образом действительно особенные, я думаю, что это будет излишним.

Если вы хотите/можете использовать стороннюю библиотеку: вы можете использовать три или конечный автомат. Они будут очень быстрыми.

Что я хотел бы порекомендовать: сначала используйте HashSet, поскольку он поставляется с каждой java. Если вы видите, что вам нужно что-то быстрее, найдите разумную реализацию trie. Но я ожидаю, что вы увидите, что хешсет достаточно быстрый.

  • 0
    FSA должен быть создан во время компиляции, чтобы иметь преимущество, не так ли?
  • 0
    Да. Но так как у вас есть десятки тысяч строк, вы должны извлечь выгоду из использования fsa, даже если вы скомпилировали его в начале.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню