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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Решение тривиальной задачи 
:(
    Опции темы
nIkTo
Дата 3.4.2010, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Задача : если значение $name встречается (без учёта регистра) в  массиве @array то сохраняем $name.

Код

#!/usr/bin/perl -w
use strict;
use Benchmark qw(timethese cmpthese);

our @array = qw(name00 name01 name02 name03 name04 name05 name06 name07 name08 name09 name10 name11 name12 name13 name14 name15);
our $name = 'name15';

my $result = timethese( -5, {
                      sub1 => \&test1,
                      sub2 => \&test2,
                      sub3 => \&test3
                    } );
cmpthese $result;


sub test1 {
  for (@array) {
    if ($name =~/^$_$/i) {
      # сохраняем $name
      last;
    }
  }
}

sub test2 {
  if ($name =~/^(name00|name01|name02|name03|name04|name05|name06|name07|name08|name09|name10|name11|name12|name13|name14|name15)$/i) {
    # сохраняем $name
  }
}

sub test3 {
  for (@array) {
    if ($name eq $_) {
      # сохраняем $name
      last;
    }
  }
}


Результат :
Цитата

Benchmark: running sub1, sub2, sub3 for at least 5 CPU seconds...
      sub1:  4 wallclock secs ( 5.27 usr +  0.00 sys =  5.27 CPU) @ 12647.83/s (n=66692)
      sub2:  5 wallclock secs ( 5.38 usr +  0.00 sys =  5.38 CPU) @ 369627.28/s (n=1989334)
      sub3:  4 wallclock secs ( 5.30 usr +  0.02 sys =  5.32 CPU) @ 263766.31/s (n=1402973)
         Rate  sub1  sub3  sub2
sub1  12648/s    --  -95%  -97%
sub3 263766/s 1985%    --  -29%
sub2 369627/s 2822%   40%    --


Комментарии :
1. Первый вариант более удобен, но медленный.
2. Второй вариант быстрый но неудобен при расширении массива.
3. Устраивает и по скорости и по реализации, но этот вариант с учётом регистра =(

подскажите вариант решения этой тривиальной задачки. спасибо.
PM   Вверх
Pfailed
Дата 3.4.2010, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

my $name = lc($name);
for(...)
{
   if($name eq lc($_))
  {

  }
}



Это сообщение отредактировал(а) Pfailed - 3.4.2010, 14:32


--------------------
PM MAIL   Вверх
amg
Дата 3.4.2010, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Еще можно проверить модификацию 1-го варианта:
Код
sub test4 {
  for (@array) {
    if (/^$name$/io) {
      # сохраняем $name
      last;
    }
  }
}

PM MAIL   Вверх
NuINu
Дата 4.4.2010, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



    if ($name =~/^$_$/i) {
      # сохраняем $name
      last;

вообщето сохранять name глупо, оно и так известно, непонятна суть этих действий. Одно дело определить есть ли в массиве name и другое дело найти индекс элемента массива под которым этот элемент присутствует в массиве.

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

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

вот я тут чуть переделал и предложил свой вариант:
Код


#!/usr/bin/perl -w
use strict;
use Benchmark qw(timethese cmpthese);
use Data::Dumper;

#our @array = qw(name00 name01 name02 name03 name04 name05 name06 name07 name08 name09 name10 name11 name12 name13 name14 name15);
our @array;
our $name = 'Name15';
my  %h_a;
my $regexp_test2;

my $is_prn = 1;
test1();
test2();
test3();
test4();
$is_prn = 0;

my $result = timethese( -5, {
                      sub1 => \&test1,
                      sub2 => \&test2,
                      sub3 => \&test3,
                      sub4 => \&test4
                    } );
cmpthese $result;



sub test1 {
    for (@array) {
    if ($name =~/^$_$/i) {
         # сохраняем $name
        print "test1: Find '$name'!\n" if($is_prn);
        last;
    }
    }
}

sub test2 {
    #if ($name =~/^(name00|name01|name02|name03|name04|name05|name06|name07|name08|name09|name10|name11|name12|name13|name14|name15)$/i) {
    if ($name =~/^($regexp_test2)$/i) {
    # сохраняем $name
    print "test2: Find '$name'!\n"  if($is_prn);
    }
}
sub test3 {
    my $n = lc($name);
    for (@array) {
    if ($n eq lc($_)) {
         # сохраняем $name
        print "test3: Find '$name'!\n" if($is_prn);
         last;
    }
    }
}

sub test4 {
    if(exists($h_a{lc($name)})) {
    print "test4: Find '$name'!\n"  if($is_prn);
    }
}

BEGIN {
    @array = qw(name00 name01 name02 name03 name04 name05 name06 name07 name08 name09 name10 name11 name12 name13 name14 name15);
    my $i = 0;
    foreach (@array) {
    $h_a{lc($_)} = $i++;
    $regexp_test2 .= $_.'|';
    }
    chop $regexp_test2;
    #print Dumper(\%h_a);
    print "regexp test2: $regexp_test2\n";
}


PM MAIL   Вверх
gcc
Дата 4.4.2010, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


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

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



вот тут вот самый быстрый вариант ( в 5-10 раз быстрее чем map foreach grep exists (хеш) void) обсуждается (тестироваля в mod_perl)
http://forum.vingrad.ru/index.php?showtopi...t&p=2128080

там правда eq встроенный оператор, там нужно не нмого переделать, елси нужно без учета регистра...

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


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

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


 




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


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

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