Поиск:

Ответ в темуСоздание новой темы Создание опроса
> алгоритм поиска подстроки, Меня интересует именно сравнение скорост 
:(
    Опции темы
shwan
  Дата 23.4.2012, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 23.4.2012

Репутация: нет
Всего: нет



Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ.
PM MAIL WWW   Вверх
_Y_
Дата 23.4.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 8
Всего: 34



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

Но проходить можно по-разному. Какой вариант лучше будет во многом зависеть от используемого языка и даже его реализации. 

1. Можно тупо сравнивать символы. Тогда придется сравнивать 8-битные буквы. Это не так глупо, так как в большинстве языков сравнение символов уже оптимизировано.

2. Поскольку символов всего 6, 8-битного представления не нужно. Достаточно 3-битного. Если можно написать оптимизированную процедуру сравнения 3-битных символов, скорее всего будет быстрее.

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

______________

Теперь, если частотность букв не одинакова. Например, есть у нас в подстроке Ъ - редко встречающийся символ. Тогда быстрее всего будет искать в строке этот символ, а потом просто сравнивать "хвосты" в обе стороны.

Эту идею можно развить и дальше. Искать самый редкий символ, потом смотреть есть ли на должном расстоянии от него второй по невстречаемости и так далее. Но большой ли это даст выигрыш - не скажу сразу.

______________


Если я недостаточно подробно расписал - требуйте пояснений smile 


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
nworm
Дата 23.4.2012, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 502
Регистрация: 22.10.2005

Репутация: 4
Всего: 8



Разветвлённая теория есть на эту тему.

Наверное, это Вы хотели:
Тут можете посмотреть сравнение алгоритмов поиска подстроки в строке

Есть ещё алгоритмы поиска массива подстрок (например, алгоритм Ахо-Корасик)
PM MAIL WWW   Вверх
disputant
Дата 24.4.2012, 04:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: 2
Всего: 3



Цитата(shwan @ 23.4.2012,  22:29)
Задача состоит в следующем: у нас есть очень длинная исходная строка, и значительно более короткая подстрока. Алфавит достаточно маленький, 5-6 символов. Подскажите наиболее быстрый алгоритм поиска, и как возможно вообще ускорить поиск? Что можете посоветовать? Меня интересует именно сравнение скорости работы алгоритмов, какой вы считаете более продуктивным по СКОРОСТИ.

Посмотрите алгоритмы типа Хорспула, Бойера-Мура или Кнута-Морриса-Пратта, и прикиньте, дают ли они существенный выигрыш при ваших конкретных условиях.
PM MAIL   Вверх
nike00
Дата 26.4.2012, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 30.3.2012

Репутация: нет
Всего: нет



Наверное кроме вопроса ТС-у стоило разместить ссылку на Хабр? Вдруг кого-то тоже заинтеерсует возможность выиграть 1 из Asus Zenbook UX31E smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0684 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.