Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > алгоритм поиска подстроки |
Автор: shwan 23.4.2012, 22:29 |
Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ. |
Автор: _Y_ 23.4.2012, 23:18 |
Если "буквы алфавита" встречаются с равной частотой, то честно говоря, не представляю себе ничего, кроме последовательного прохода всех положений от начала строки до конца (минус длина подстроки, конечно). Но проходить можно по-разному. Какой вариант лучше будет во многом зависеть от используемого языка и даже его реализации. 1. Можно тупо сравнивать символы. Тогда придется сравнивать 8-битные буквы. Это не так глупо, так как в большинстве языков сравнение символов уже оптимизировано. 2. Поскольку символов всего 6, 8-битного представления не нужно. Достаточно 3-битного. Если можно написать оптимизированную процедуру сравнения 3-битных символов, скорее всего будет быстрее. 3. Перевести обе строки в биты и сравнивать побитно. Опять же, при прочих равных, такое сравнение будет наиболее быстрым. Однако, в этом случае надо будет учесть-отбросить редкие случаисовпадения со сдвигом; т.е. случаи когда битовая последовательность совпала, но не с начала буквы, а откуда-то с середины. Впрочем, даже простая проверка в символьной форме много времени на займет по сравнению со временем прохода. ______________ Теперь, если частотность букв не одинакова. Например, есть у нас в подстроке Ъ - редко встречающийся символ. Тогда быстрее всего будет искать в строке этот символ, а потом просто сравнивать "хвосты" в обе стороны. Эту идею можно развить и дальше. Искать самый редкий символ, потом смотреть есть ли на должном расстоянии от него второй по невстречаемости и так далее. Но большой ли это даст выигрыш - не скажу сразу. ______________ Если я недостаточно подробно расписал - требуйте пояснений ![]() |
Автор: nworm 23.4.2012, 23:18 |
Разветвлённая теория есть на эту тему. Наверное, это Вы хотели: http://algolist.manual.ru/search/esearch/ Есть ещё алгоритмы поиска массива подстрок (например, http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%90%D1%85%D0%BE_%E2%80%94_%D0%9A%D0%BE%D1%80%D0%B0%D1%81%D0%B8%D0%BA) |
Автор: disputant 24.4.2012, 04:56 | ||
Посмотрите алгоритмы типа Хорспула, Бойера-Мура или Кнута-Морриса-Пратта, и прикиньте, дают ли они существенный выигрыш при ваших конкретных условиях. |
Автор: nike00 26.4.2012, 10:39 |
Наверное кроме вопроса ТС-у стоило разместить ссылку на http://habrahabr.ru/company/intel/blog/142312/? Вдруг кого-то тоже заинтеерсует возможность выиграть 1 из Asus Zenbook UX31E ![]() |