Когда мне нужно проверить предыдущее появление какого-либо элемента, я использую словарь. В большинстве случаев. Но в процессе проверки кода я обнаружил, что товарищи по команде используют строку для хранения данных и просто используют «если X в строке» для проверки предыдущего вхождения.
Я уже начал чесаться, мне нужно было знать разницу в терминах сложности. После исследования я обнаружил, что строковый модуль Python использует комбинацию алгоритмов Boyer-Moore и Horspool для поиска подстроки. Просто хорошо, теперь я знал названия алгоритмов. Вы можете увидеть код здесь.
Давайте попробуем сравнить строковый и словарный оператор «in» Python для нашего случая.
Я написал это просто для удовольствия, и рассматриваю только мой практический случай. Буду рад, если вы расскажете мне о моих ошибках.
Ввод, у нас есть длинная строка и короткая строка.
len(длинная строка)/5 = len(короткая строка)
Мы попробуем найти персонажа. Также мы создадим словарь из наших длинных строк, каждый символ является ключевым, а значение равно 0. Словарь будет кратчайшим, чем строка. Например:
long_string='Привет всем'
dict = {'H': 0, 'e': 0, 'l': 0, 'o': 0, ' ': 0, 'v': 0, 'r': 0, 'y': 0, 'н': 0}
В лучшем случае попробуем найти первую букву Н. Это должен быть более быстрый случай для поиска строки и, как правило, 0 (1) случай в словаре. Найти первую букву не должно зависеть от длины строки. Код можно посмотреть здесь
Ага. Все работает, как я и ожидал.
Худший случай. Попробуем найти последний символ из строки, время работы должно зависеть от длины строки. А как мы знаем, операция доступа к словарю не зависит от количества элементов. Но Питон умнее меня. Я должен выбрать уникальный символ и поместить его в конец строки. Я использовал заглавные буквы для строки. Код здесь
Сначала я пытался использовать «#» в качестве уникального символа, это работает очень хорошо:
И я не обнаружил строковый «тяжелый» алгоритм поиска. Длинная струна в 5 раз длиннее короткой, но время работы было таким же.
Когда я выбрал экзотический символ UTF-16 «ы», время работы стало таким, как я ожидал:
Мое резюме:
В моей работе инженером по инфраструктуре, когда мы создаем внутренние инструменты, нет большой разницы, какой поиск используется. Поиск в словаре или в строке. Мы работаем только с символами ASCII и короткими строками.
P.S: да, я понимаю разницу, если мы будем работать с более длинными строками, чем строки символов.
Я свободен для обсуждения и буду бороться за правду. :)