Nano Hash - криптовалюты, майнинг, программирование

Эффективность поиска JList

Я наткнулся на код Java для поиска префикса в JList. Однако, глядя на это, суть алгоритма довольно неэффективна, он использует линейный поиск по списку для каждого нажатия клавиши и выполняет медленное преобразование регистра в узком цикле.

Я бы предположил, что для очень больших объемов данных специально реализованное троичное дерево поиска было бы гораздо более эффективным решением. Однако, если кто-то стремился к простому коду и не предъявлял требований к производительности, обуславливающих такие сложности, есть ли другие более простые способы улучшить этот алгоритм, не требуя значительного объема дополнительного кода?

for (int i=0; i < jList1.getModel().getSize(); i++) {
    String str = ((String)jList1.getModel().getElementAt(i)).toLowerCase();
    if (str.startsWith(m_key)) {
        jList1.setSelectedIndex(i); 
        jList1.ensureIndexIsVisible(i); 
        break;
    }
}

  • Вы определили, что это вызвало проблемы с производительностью? JList обычно содержит всего несколько элементов (иначе их нельзя было бы использовать), а компьютеры выполняют миллиарды инструкций в секунду. GUI тратит большую часть времени на ожидание пользовательских событий. Не оптимизируйте преждевременно. Этот код прост, легко поддерживается и, вероятно, не причиняет никакого вреда. 19.01.2012
  • Дж. Б. Низе: именно из-за вашего беспокойства по поводу преждевременной оптимизации я пока не хочу заниматься реализацией и тестированием всей структуры данных для ее оптимизации! Но если бы были другие изменения, которые можно было бы внести, сохранив код простым и удобным в сопровождении, я полностью за лучший код и упражнение в размышлениях о балансе между эффективностью и простотой. 19.01.2012
  • Могу я спросить, для чего это будет использоваться? Потому что, если вы создадите какой-то алгоритм автозаполнения, у вас будет замечательная производительность при использовании словаря B-дерева. Но это бесполезно для графического представления, и это намного сложнее. Кстати, если ваш список отсортирован, вы можете легко оптимизировать свой код. 19.01.2012
  • лучше всего поддерживать код, который вам не нужно поддерживать :-) Или, другими словами: не беспокойтесь о основных деталях Swing, пока они вас не укусят. Его инженеры, вероятно, взвесили варианты для типичных вариантов использования. Поэтому, если они решили оставить простой последовательный алгоритм, который можно считать достаточно хорошим в первом приближении, пока вы не столкнетесь с исключительным вариантом использования. 19.01.2012

Ответы:


1

Для быстрого изменения рассмотрим

String str = ((String)jList1.getModel().getElementAt(i));
str.substring(1, m_key.length()).equalsIgnoreCase(m_key);

И еще один шаг — ваша собственная реализация startsWithIgnoreCase, которая должна быть быстрой и простой в написании.

РЕДАКТИРОВАТЬ: кажется, что это прокручивает список до элемента, который соответствует вводу пользователя. Вы определенно должны рассмотреть более сложную структуру данных. Это делается много, возможно, вы сможете найти какой-нибудь эффективный алгоритм в сети.

18.01.2012
  • С какой целью вы пропускаете первый символ? 19.01.2012

  • 2

    Вероятно, самой быстрой оптимизацией (для времени написания кода, а не времени выполнения) будет сортировка списка, а затем выполнение бинарного поиска. У вас есть единовременные авансовые затраты на поиск (которые, если они используются часто, будут амортизированы), а затем вы перейдете от O (n) к O (log (n)). По моему опыту, бинарный поиск относительно прост и использует те же структуры данных, которые у вас уже есть.

    Конечно, отсортированная структура n-дерева будет быстрее алгоритмически, но потребует новых структур данных и большего времени на кодирование/тестирование. Решите, где вы хотите провести время.

    19.01.2012
  • +1 за прямой подход. Это ответ, который следует принять, поскольку другие являются незначительными улучшениями мусора. 19.01.2012

  • 3

    Я не согласен со всеми ответами, размещенными здесь (и немного зашифрованными JB Nizet). Возможной альтернативой JList является JTable с одним столбцом (с или без TableHeader). JTable имеет хорошую реализацию сортировки и фильтрации.

    19.01.2012
  • Хорошая альтернатива! Что такое зашифровано? 19.01.2012

  • 4

    Не просматривайте весь список на каждой итерации. Вы можете сделать (n!) итераций в списке, где (n) — это все, что вам нужно.

    Если список можно отсортировать, используйте частичное сравнение для быстрого получения правильных ответов. Однако, если вам нужно создать свою собственную функцию поиска, это может быть грязно.

    19.01.2012
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..