Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Поиск по текстовику


Автор: n0xi0uzz 4.3.2006, 09:42
В общем, задача реализовать поиск слова в текстовом файле как можно более быстро. Что-то где-то слышал, что лучше это сделать за счёт связанных списков. Насколько я понял, в Perl они реализуются за счет хешей. Но, по скольку никогда с ними не работал, прошу рассказать, как это реализуется и какие ещё способы можно найти.

Сорри, если где протупил smile

Автор: sharq 4.3.2006, 11:42
n0xi0uzz,
Цитата(n0xi0uzz @ 4.3.2006, 10:42 Найти цитируемый пост)
задача реализовать поиск слова в текстовом файле как можно более быстро

тебе нужно найти просто слово или количество его повторений?
Если просто слово, то испольщуй ре, только подумай, что является словом.
Если количестов повторений, то, действительно, без хеша тебе не обойтись.

smile

Автор: tishaishii 4.3.2006, 13:47
Код
use locale;
print scalar @{[
   'строка, где ищем слово (СЛОВО)'=~m{\bслово\b}gios
]}

Автор: n0xi0uzz 4.3.2006, 14:19
Цитата(sharq @ 4.3.2006, 11:42)
Если просто слово, то испольщуй ре, только подумай, что является словом.

Мне надо найти слово в тексте. Эммм, только вот я не понял, что использовать? Что есть "ре"?


2tishaishii это я знаю, но неужели это самый быстрый способ?

Автор: sharq 4.3.2006, 17:31
n0xi0uzz,
Цитата(n0xi0uzz @ 4.3.2006, 15:19 Найти цитируемый пост)
Что есть "ре"?

ре - это re (regular expressions), регулярные выращения!

Цитата(n0xi0uzz @ 4.3.2006, 15:19 Найти цитируемый пост)
неужели это самый быстрый способ?

А как по другому? Другого способа, лучше чем этот в perl нет!

Только я бы вот так написал:
Код

use strict;
use locale;
use Data::Dumper;

my $text = qq~
-Hello, how are you?
-Нормально! And you?
-Fine!!!
~;

my $h;
map { $h->{$_}++ } $text =~ m{\b[\wА-Яа-я\-]+\b}smg;
print Dumper $h;


smile

Автор: rcdimon 4.3.2006, 18:39
Ну еще есть вариант- создать файл с проиндексированным нужным файлом. Но вот только как организовать эту индексную структуру- другой вопрос smile

Автор: n0xi0uzz 4.3.2006, 19:17
А если проходить циклом for с двух сторон по файлу? Не быстрее будет? Или ещё что-нить такое придумать...

Или я туплю?

Автор: rcdimon 4.3.2006, 19:40
А если разделить файл на несколько частей и запустить их сканирование в несколько потоков одновременно?

Автор: n0xi0uzz 4.3.2006, 21:02
Дык я и спрашиваю, как быстрее smile.

Автор: rcdimon 4.3.2006, 21:54
ну конечно многопоточно быстрее
Добавлено @ 21:58
вообще-то быстрее засунуть файл в базу данных, там настроить индексы и производить выборку из базы.. но если у тебя только один файл, который никак не поделить на отдельные записи (не имеет структуры, как обычный текст) то это крайне кривое решение smile Использовать базу данных с одной таблицей, в которой будет один столбец. в базе будет одна запись - твой файл smile

Автор: sharq 4.3.2006, 22:04
n0xi0uzz,
Цитата(n0xi0uzz @ 4.3.2006, 20:17 Найти цитируемый пост)
А если проходить циклом for с двух сторон по файлу?

и дальше, искать как будешь посимвольно или как?
это тебе не Cи, здесь рулят регулярные выражения, вот ре написать, стоит подумать как будет оптимальней.

smile
Добавлено @ 22:07
rcdimon,
Цитата(rcdimon @ 4.3.2006, 22:54 Найти цитируемый пост)
ну конечно многопоточно быстрее

smile
Многопоточность полезна только при программировании сетевых интерфейсов!

Автор: n0xi0uzz 4.3.2006, 23:54
Цитата(sharq @ 4.3.2006, 22:04)
и дальше, искать как будешь посимвольно или как?

Ну почему же... Построчно по файлу идти, загнав предварительно его содержимое в массив, в строке искать при помощи все тех же регулярок. Вопрос в том, как идти.

Автор: tishaishii 5.3.2006, 01:54
Код
map { $h->{$_}++ } $text =~ m{\b[\wА-Яа-я\-]+\b}smg;
Не может быть быстрым.
Код
$h->{$_}++  while $text =~ m{\b[\wА-Яа-я\-]+\b}scmg;
- гораздо быстрее. Но тот способ, что я показал сперва - ещё быстрее.

Автор: sharq 5.3.2006, 13:11
tishaishii,
Цитата(tishaishii @ 5.3.2006, 02:54 Найти цитируемый пост)

map { $h->{$_}++ } $text =~ m{\b[\wА-Яа-я\-]+\b}smg;
Не может быть быстрым.

Что здесь может быть небыстрым?
Только обработка найденного, т.е. создания хеша слов с количеством упоминания слова в тексте.
А поиск через регулярное выражения работает так же быстро, как и твое.
Ключик o в твоем первом примере не много чего решает. smile
А вот ключик с в совокупности с m и g - полезный!
И затея с map - хуже, чем с while. smile

Твой первый пример ищет конкретное слово, а точнее количество употреблений конкретного слова,
а мой пример ищет все слова и количество их употреблений в тексте. Поэтому твой пример быстрее.

smile

Автор: tishaishii 5.3.2006, 14:04
Использование map добавляет создание безымянного массива.

Автор: sharq 5.3.2006, 17:55
tishaishii,
Цитата(tishaishii @ 5.3.2006, 15:04 Найти цитируемый пост)
Использование map добавляет создание безымянного массива.

ты прав и еще map и grep возращает новый список элементов, поэтому в данном случае действительно лучше через while!

smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)