Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск по текстовику, релизация 
:(
    Опции темы
n0xi0uzz
  Дата 4.3.2006, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Сорри, если где протупил smile
PM MAIL WWW ICQ   Вверх
sharq
Дата 4.3.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

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

smile

Это сообщение отредактировал(а) sharq - 4.3.2006, 11:49


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
tishaishii
Дата 4.3.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



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

PM MAIL ICQ Skype   Вверх
n0xi0uzz
Дата 4.3.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


2tishaishii это я знаю, но неужели это самый быстрый способ?
PM MAIL WWW ICQ   Вверх
sharq
Дата 4.3.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
rcdimon
Дата 4.3.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



Ну еще есть вариант- создать файл с проиндексированным нужным файлом. Но вот только как организовать эту индексную структуру- другой вопрос smile
PM MAIL ICQ   Вверх
n0xi0uzz
Дата 4.3.2006, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Или я туплю?
PM MAIL WWW ICQ   Вверх
rcdimon
Дата 4.3.2006, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



А если разделить файл на несколько частей и запустить их сканирование в несколько потоков одновременно?
PM MAIL ICQ   Вверх
n0xi0uzz
Дата 4.3.2006, 21:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дык я и спрашиваю, как быстрее smile.
PM MAIL WWW ICQ   Вверх
rcdimon
Дата 4.3.2006, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 766
Регистрация: 12.7.2004
Где: Москва

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



ну конечно многопоточно быстрее
Добавлено @ 21:58
вообще-то быстрее засунуть файл в базу данных, там настроить индексы и производить выборку из базы.. но если у тебя только один файл, который никак не поделить на отдельные записи (не имеет структуры, как обычный текст) то это крайне кривое решение smile Использовать базу данных с одной таблицей, в которой будет один столбец. в базе будет одна запись - твой файл smile
PM MAIL ICQ   Вверх
sharq
Дата 4.3.2006, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

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

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

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


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
n0xi0uzz
Дата 4.3.2006, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

Ну почему же... Построчно по файлу идти, загнав предварительно его содержимое в массив, в строке искать при помощи все тех же регулярок. Вопрос в том, как идти.
PM MAIL WWW ICQ   Вверх
tishaishii
Дата 5.3.2006, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Код
map { $h->{$_}++ } $text =~ m{\b[\wА-Яа-я\-]+\b}smg;
Не может быть быстрым.
Код
$h->{$_}++  while $text =~ m{\b[\wА-Яа-я\-]+\b}scmg;
- гораздо быстрее. Но тот способ, что я показал сперва - ещё быстрее.
PM MAIL ICQ Skype   Вверх
sharq
Дата 5.3.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

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



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

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

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

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

smile

Это сообщение отредактировал(а) sharq - 5.3.2006, 13:13


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
tishaishii
Дата 5.3.2006, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


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

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



Использование map добавляет создание безымянного массива.
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


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

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


 




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


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

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