|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin, ахо-корасик - это комбинация однопроходного пратта с поиском по словарю Критично время поиска по словарю, если пренебречь временем его построения. Исходный алгоритм работал на trie (сначала переводили как бор, теперь вроде луч прижился) - старая структура 1959 года рождения. В её исходном виде преимущество состоит в совмещении общего префикса в шаблонах поиска - при наличии общего префикса в отыскиваемых строках, поиск автоматически идет по всему подмножеству элементов словаря с таким общим префиксом. Недостаток - расточительность по памяти на "современных" строках. В какой-то момент структура умерла из-за требований по памяти на расширившемся общем строковом алфавите. При неудачных реализациях может проигрывать по скорости другим вариантам организации словаря. Было несколько попыток вдохнуть вторую жизнь в эту структуру. Как просто модернизацией конструкции - типа перехода к троичному дереву, так и совмещением с идеями поразрядной сортировки. Почитай у Седжвика - он много времени этому вопросу сам посвятил. Ахо-Корасик не обязан выигрывать просто потому, что есть словарь К нему мозг в конкретной ситуации рекомендуется прикладывать... Его пригодность к работе на потоке данных без возврата к предыдущим символам потока - это как раз то, что в определенных ситуациях важнее всего остального. Потому и прикладывают... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 18:24 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin love_bach пропущено... это вообще возможно впринципе? Вы сами ахо карасика смотрели? Он за один проход работает. Построение дерева делается от исходных слов до начала прохода. я уже могу путаться, но Кнут-Моррис-Прат - точно за два если ишешь именно алгоритм, то тебе дорога в суффиксные деревья ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 18:26 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin Сколько по вашему должен работать оптимальный алгоритм, тот же самый ахо-карасик? По мне так за 10 сек, если все в памяти и должен выдать массив со счетчиком вхождений. Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает. У вас 35 миллионов сравнений. Разделим на 10 секунд, которые вы хотите. Значит в секунду должно отрабатывать 3.5 млн сравнений. Но это без учёта длины строк. Мы не знаем что вы там и с чём сравниваете. Скорость вычисления вхождения строки из 10 символов в строке 100 символов будет отличаться от строки из 100 символов в строке 10000 символов. Мы не знаем что у вас там за исходные данные. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 18:39 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
hVostt a_voronin Сколько по вашему должен работать оптимальный алгоритм, тот же самый ахо-карасик? По мне так за 10 сек, если все в памяти и должен выдать массив со счетчиком вхождений. Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает. У вас 35 миллионов сравнений. Разделим на 10 секунд, которые вы хотите. Значит в секунду должно отрабатывать 3.5 млн сравнений. Но это без учёта длины строк. Мы не знаем что вы там и с чём сравниваете. Скорость вычисления вхождения строки из 10 символов в строке 100 символов будет отличаться от строки из 100 символов в строке 10000 символов. Мы не знаем что у вас там за исходные данные. ну, он видимо про линейность сложности. а тут х..якс - вроде и линейно, но сильно высокая ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:02 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
hVostt Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает Какого алгоритма? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:09 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
love_bach hVostt Так на сложность алгоритма смотрите. Сколько операций нужно сделать, чудес-то не бывает Какого алгоритма? Ну в данном случае алгоритм -- простой перебор, строк, затем символов в строках. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:19 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
love_bach ну, он видимо про линейность сложности. а тут х..якс - вроде и линейно, но сильно высокая Это примерно как в магазин ходить и спрашивать "а чёт так дорого-то?" :) А сколько "не дорого"? Т.е. почему мои N операций выполняются долго? Почему это "долго"? По сравнению с чем? Это ж странно. Непонятна какая задача. Достигнуть символического комфорта? 10 секунд долго, но 9 уже нормас? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:22 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
hVostt love_bach пропущено... Какого алгоритма? Ну в данном случае алгоритм -- простой перебор, строк, затем символов в строках. hVostt - это не перебор. ТС тоже это понимает ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 19:33 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно Попробовал посчитать скорость: допустим в каждой из 65000 строк в среднем 1000 символов (с запасом), т.е. 65 млн. символов. Один поиск идет 18 минут / 600 = 1.8 сек. Отсюда скорость поиска 65 млн. символов / 1.8 сек = 36.1 млн. символов / сек. При частоте проца 3,6 ГГц - 100 тактов на одно сравнение. Это как бы вообще тормоз. ИМХО тут что-то важное не озвучено, то на что действительно тратится время. Тут надо искать a_voronin Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 20:19 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
Dima T, Как бы мы тут все гадаем, как же ускорить неизвестный код с неизвестными нам данными ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:43 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
love_bach hVostt - это не перебор. ТС тоже это понимает Ну что там ещё? Вычисление интегралов? Экстраполирование? Расчёт пути в графе? ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.04.2020, 23:43 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
Dima T a_voronin поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно Попробовал посчитать скорость: допустим в каждой из 65000 строк в среднем 1000 символов (с запасом), т.е. 65 млн. символов. Один поиск идет 18 минут / 600 = 1.8 сек. Отсюда скорость поиска 65 млн. символов / 1.8 сек = 36.1 млн. символов / сек. При частоте проца 3,6 ГГц - 100 тактов на одно сравнение. Это как бы вообще тормоз. ИМХО тут что-то важное не озвучено, то на что действительно тратится время. Тут надо искать a_voronin Код: c# 1.
Наиболее трудоемкое для процессора действия это вызов метода. CALL. Второе по трудоемкости -- это условный переход. А если вы пишете операции со строками, то вызовом метода там немало. Все свойства это методы. Тут вопрос скорее всего не в алгоритме, а в том, чтобы найти оптимизированный, оптимально написанный код. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 08:01 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
[quot hVostt#22120128] a_voronin Значит в секунду должно отрабатывать 3.5 млн сравнений. За секунду может срабатывать 3 миллиарда x 8 = 24 сравнений символов. Не вижу причин, которым нельзя работать с такой скоростью. Попробую может вечером как-нибудь в качестве спортивного интереса написать на unmanaged коде без вызова методов. Код собственно говоря выглядит вот так. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
В среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо. Если брекить дебаггер он как правило встает здесь. first = source.IndexOf(c0, ++first, limit - first); А вообще простая строка кода превращается в нагромождение непонятно чего. Вот на такие вызовы методов и тратятся такты. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 08:17 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin Меня устроит полминуты. 800 строк по 10-30 символов, найти каждая входит или нет в 90000 строк от 200 до 8000 символов (в среднем 2000). … должен выдать массив со счётчиком. a_voronin Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет. Нужен быстрый массовый поиск, потому что поиск 600 строк в 65000 строк идет 18 минут и это слишком медленно. Если вы уверены что проблема в языке/оптимизации кода то я вам помочь не могу, но и мнение ваше не разделяю. Тот код что вы смотрите и тот что выполняется на процессоре уже может отличатся и CLR наверняка заменит source.IndexOf(c0, 0, limit); на низкоуровневый cmpsw. А для оптимизации алгоритма нужно кое-что уточнить. — В чем у вас проблема? Если набор поиска и набор строк текста постоянный то запишите сразу результату поиска. Я так предполагаю что у вас или набор строк поиска или набор строк текста или оба не постоянный. Проясните что. — Текст на каком языке? — что является источником меняемого набора (поиска или текста)? a_voroninВ среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо. — любое вхождение или первое? — что нужно узнать: что вхождение есть, вхождение какой подстроки (давайте уже использовать подходящий лексикон — шаблон) или место вхождения? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 09:40 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron, Это анализ залогированных MDX запросов для сбора статистики об использовании показателей. Показатели постоянны, запросы разные. C# по оптимизации кода явно уступает C++. На C++ здесь вообще не было бы вызова метода. if (source[first + 1] != c1) { Код я смотрю в дебаге. По нему можно ходить дебаггером и смотреть регистры. Поэтому это явно реальный конечный код. Goto Dissasembly не заглядывали? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 10:08 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron — любое вхождение или первое? — что нужно узнать: что вхождение есть, вхождение какой подстроки (давайте уже использовать подходящий лексикон — шаблон) или место вхождения? если вы посмотрите на начало поста, то там сформулирована задача "Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет." Факт наличия нескольких подстрок в строке. Даже не количество и не позиции. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 10:09 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin, А код обработки учитываете? Вместе с довольно ресурсоёмким локом-монитором? FastIndexOf содержит весьма сомнительные и нафиг не нужные оптимизации. Почему не используете StringComparison.Ordinal? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 11:20 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin, Давайте сначала уточним определения. "Факт наличия нескольких подстрок в строке. " "подстрока" - шаблон поиска. "строка" или текст, в котом происходит поиск. Таким образом у вас набор шаблонов поиска постоянный, или почти постоянный и меняется редко, верно? Ваша проблема заключается в том что поиск в динамическом наборе строк выполнятся медленно, но сам набор строк динамичен и не известен заранее. т.е. его нельзя предварительно обработать. Верно? Тепер ещё раз к постановке задачи: автор"Нужен механизм, которые ищет много строк массово и выдает массив вхождений. 3 8 22 66 найдены. Остальные нет." В среднем в строке может встречаться 20 подстрок. Если одно вхождение конкретной строки найдено, других искать не надо. Факт наличия нескольких подстрок в строке. Даже не количество и не позиции. Ваши условия противоречивы: Если вам не интересуют какие конкретно шаблоны найдены и где они найдены то что есть "массив вхождений. 3 8 22 66 найдены." "Если одно вхождение конкретной строки найдено, других искать не надо." Если 'то условие верно как понимать "Факт наличия нескольких подстрок в строке." вообше не может быть установлен так - как для 'того надо минимум совпадение двух шаблонов. Уточните пожалуйста. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 11:32 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron, Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ананасы"] В строке поиска "В саду созрели груши и сливы" ответ ["груши", "сливы"] или [1,2] при нумерации от 0 "У нас не растут ананасы, выращивайте яблоки" ответ ["яблоки", "ананасы"] или [0,3] ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 12:37 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin mikron, Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ананасы"] В строке поиска "В саду созрели груши и сливы" ответ ["груши", "сливы"] или [1,2] при нумерации от 0 "У нас не растут ананасы, выращивайте яблоки" ответ ["яблоки", "ананасы"] или [0,3] Вы совсем запутали меня. Значит нас интересуют какие шаблоны найдены? Нам нужно знать все шаблоны, или только первый, или любой, или только что минимум два, или что минимум два разных, или вообще что хоть один? Я не из дотошности спрашиваю, просто это разные задачи и для них разные методы. Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ивы", "ананасы"] В строке поиска "В саду росли яблоки и сливы" Ответ "шаблон найден" верный? Ответ ["яблоки"] верный? Ответ ["ивы"] верный? Ответ ["яблоки", "ивы"] верный? Ответ ["ивы", "яблоки"] верный? Ответ ["ивы", "сливы"] верный? Ответ ["яблоки", "сливы", "ивы"] верный? В строке поиска "В саду росли сливы" Ответ "шаблон найден" верный? Ответ ["ивы"] верный? Ответ ["ивы", "сливы"] верный? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 13:04 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron, Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ивы", "ананасы"] В строке поиска "В саду росли яблоки и сливы" Ответ ["яблоки", "сливы", "ивы"] верный. Но в моей реальной задаче не будет "сливы", "ивы" все строки уникальны и ни одна не является подстрокой другой. то есть ответ Ответ ["яблоки", "сливы"] тоже устроит. Хотя, я так понимаю может быть нюанс в реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:22 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron a_voronin mikron, Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ананасы"] В строке поиска "В саду созрели груши и сливы" ответ ["груши", "сливы"] или [1,2] при нумерации от 0 "У нас не растут ананасы, выращивайте яблоки" ответ ["яблоки", "ананасы"] или [0,3] Вы совсем запутали меня. Значит нас интересуют какие шаблоны найдены? Нам нужно знать все шаблоны, или только первый, или любой, или только что минимум два, или что минимум два разных, или вообще что хоть один? Я не из дотошности спрашиваю, просто это разные задачи и для них разные методы . Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ивы", "ананасы"] В строке поиска "В саду росли яблоки и сливы" Ответ "шаблон найден" верный? Ответ ["яблоки"] верный? Ответ ["ивы"] верный? Ответ ["яблоки", "ивы"] верный? Ответ ["ивы", "яблоки"] верный? Ответ ["ивы", "сливы"] верный? Ответ ["яблоки", "сливы", "ивы"] верный? В строке поиска "В саду росли сливы" Ответ "шаблон найден" верный? Ответ ["ивы"] верный? Ответ ["ивы", "сливы"] верный? приведи хотя бы один ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 14:31 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin mikron, Ищем постоянный набор строк ["яблоки", "груши", "сливы", "ивы", "ананасы"] В строке поиска "В саду росли яблоки и сливы" Ответ ["яблоки", "сливы", "ивы"] верный. то есть ответ Ответ ["яблоки", "сливы"] тоже устроит. 1.Вариант: вариация Карп-Рабин. (условие - мин. длина шаблона 8 символов) 1.0. Подготовка к поиску 1.1. Представте шаблоны в масивы байт. 1.2. Пострийте хештаблицу на ваши шаблоны. Именно таблицу на массивах без классов блиблиотеки. особенно важно как строить. для каждого шаблона каждые 4 байта и есть хеш. т.е. 0..3, 1..4, 2..5, 3..6, 4..7, .... Сама таблица [номер шаблона << 4 + смешение начала ] 1.3. Поиск 1.4. Перевидите строку в байты. Сравнивайте с хештаблицей. Если поподание есть то проверит полное соответсвие. Сравниваите толко с 4-х кратнзч позиций. 0..3, 4..7, 8..11, ... 2. Вариант: если шаблоны короткие но длинее 3 символов. Идея как вариант1, но хеш фукция должна быстро строится и подстариватся. Я уже не помню как такой класс хеш функций называется но XOR как раз о ней. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 16:47 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
a_voronin, Если у вас данные секрета не представляют, выложите тут, потренируемся на них. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 17:55 |
|
массовый поиск подстрок в строке
|
|||
---|---|---|---|
#18+
mikron, Вот тестовые данные -- попробуйте перебить обычный цикл с Contains? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64.
... |
|||
:
Нравится:
Не нравится:
|
|||
22.04.2020, 18:07 |
|
|
start [/forum/topic.php?fid=20&msg=39949916&tid=1398562]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
200ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 320ms |
0 / 0 |