Поиск быстро через отсортированный список строк в C++

Вы можете отправить клавиатуру сообщения или мышь сообщения на определенный дескриптор с помощью Sendmessage, указав дескриптор, но проблема заключается в том, чтобы определить источник сообщения: какое устройство отправляет это сообщение ?? Чтобы различать устройства ввода, вам нужно использовать Raw Input API. Это требует некоторых навыков ....

7
задан Community 23 May 2017 в 12:09
поделиться

10 ответов

Если Ваш список строк исправлен во время компиляции, используйте gperf КАВЫЧКУ http://www.gnu.org/software/gperf/: gperf является идеальным генератором хеш-функции. Для данного списка строк это производит хеш-функцию и хеш-таблицу, в форме C или кода C++, для поиска значения в зависимости от входной строки. Хеш-функция прекрасна, что означает, что хеш-таблица не имеет никаких коллизий, и для поиска хеш-таблицы нужно единственное сравнение строк только.

Выводом gperf не управляют gpl или lgpl, afaik.

10
ответ дан 6 December 2019 в 06:38
поделиться

Что случилось со станд.:: вектор? Загрузите его, вид (v.begin (), v.end ()) однажды и затем используйте lower_bound (), чтобы видеть, находится ли строка в векторе. lower_bound, как гарантируют, будет O (log2 N) на отсортированном итераторе произвольного доступа. Я не могу понять потребность в хеше, если значения фиксируются. Вектор берет меньше комнаты в памяти, чем хеш и делает меньше выделений.

4
ответ дан 6 December 2019 в 06:38
поделиться

Вы могли попробовать PATRICIA Trie, если ни один из стандартных контейнеров не удовлетворяет Ваши потребности.

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

Проверьте его здесь.

Примечание: PATRICIA = практический алгоритм для получения информации, кодированной в алфавитно-цифровом

6
ответ дан 6 December 2019 в 06:38
поделиться

Если это - фиксированный список, отсортируйте список и сделайте двоичный поиск? Я не могу вообразить только с приблизительно ста строками на современном ЦП, Вы действительно собираетесь видеть любое заметное различие между алгоритмами, если Ваше приложение не делает, только поиск сказал что список 100% времени.

3
ответ дан 6 December 2019 в 06:38
поделиться

Если набор строк для проверки на числа в сотнях, как Вы говорите, и это при выполнении ввода-вывода (загружающий файл, который я принимаю, прибывает из диска, обычно), то я сказал бы: представьте то, что Вы имеете перед поиском более экзотических / сложных решений.

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

То, что я говорю, сводится для "рассмотрения примера использования и типичных сценариев, прежде (по) оптимизации", которую я предполагаю, просто специализация той старой вещи о корнях зла... :)

1
ответ дан 6 December 2019 в 06:38
поделиться

Я сомневаюсь, что Вы придумали лучшую хеш-таблицу; если список время от времени варьируется, Вы, вероятно, получили лучший способ.

Самый быстрый путь состоял бы в том, чтобы создать конечный автомат для сканирования входа. Я не уверен, что лучшие современные инструменты (это были более чем десять лет, с тех пор как я сделал что-либо как это на практике), но Закон/Flex был типичным конструктором Unix.

FSM имеет таблицу состояний и список принятия состояний. Это запускается в начинающемся состоянии и делает познаковое сканирование входа. Каждое состояние имеет запись для каждого возможного вводимого символа. Запись могла или быть должна войти в другое состояние или прерваться, потому что строка не находится в списке. Если FSM добирается в конец входной строки без прерывания, это проверяет конечное состояние, в котором это находится, который является любой состоянием принятия (в этом случае, Вы соответствовали строке), или это не (в этом случае, Вы не имеете).

Любая книга по компиляторам должна иметь больше детали, или можно, несомненно, найти больше информации о сети.

2
ответ дан 6 December 2019 в 06:38
поделиться

100 уникальных строк? Если бы это часто не называют, и список не изменяется динамично, я, вероятно, использовал бы прямой массив символов константы с линейным поиском. Если Вы не ищете его много, что-то, что маленький просто не стоит дополнительного кода. Что-то вроде этого:

const char _items[][MAX_ITEM_LEN] = { ... };
int i = 0;
for (;  strcmp( a, _items[i] ) < 0 && i < NUM_ITEMS; ++i );
bool found = i < NUM_ITEMS && strcmp( a, _items[i] ) == 0;

Для списка, настолько маленького, я думаю, Ваши затраты на внедрение и затраты на обслуживание с чем-либо более сложным, вероятно, перевесили бы затраты времени выполнения, и Вы действительно не собираетесь получать более дешевые затраты пространства, чем это. Для получения немного большей скорости Вы могли сделать хеш-таблицу первого символа-> индекс списка для устанавливания начального значения меня;

Для списка это маленькое, Вы, вероятно, не станете намного быстрее.

1
ответ дан 6 December 2019 в 06:38
поделиться

Я не знаю, какой вид хеш-функции MS использует для жал, но возможно Вы могли придумать что-то более простое (=faster), который работает в Вашем особом случае. Контейнер должен позволить Вам использовать пользовательский класс хеширования.

Если это - проблема реализации контейнера, можно также попробовать если станд. повышений:: tr1:: unordered_set дает лучшие результаты.

0
ответ дан 6 December 2019 в 06:38
поделиться

хеш-таблица является хорошим решением, и при помощи существующей ранее реализации Вы, вероятно, получите хорошую производительность. альтернативу, хотя я верю, называют, "индексируя".

имейте в наличии некоторые указатели на удобные местоположения. например, если его буквы использования для сортировки, сохраните указатель на все запускающееся aa, ab, ac... ba, до н.э, бод... это - несколько сотен указателей, но означает, что можно пропустить к части списка, который является вполне близко к результату перед продолжением. например, если запись, "afunctionname" затем, Вы можете двоичный поиск между указателями для AF и ag, намного быстрее, чем поиск всех..., если у Вас будет миллион записей всего, то у Вас, вероятно, только будет к двоичному поиску список нескольких тысяч.

я заново изобрел это конкретное колесо, но уже может быть много реализаций там, которые сохранят Вас головная боль реализации и вероятно быстрее, чем какой-либо код, в котором я мог вставить здесь.:)

0
ответ дан 6 December 2019 в 06:38
поделиться

Вы используете двоичный поиск, который равен O (log (n)). Вам следует обратить внимание на поиск с интерполяцией, который не так хорош в «худшем случае», но средний случай лучше: O (log (log (n)).

0
ответ дан 6 December 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: