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


Автор: CiH 8.1.2009, 19:19
Подскажите, пожалуйста новичку.
Есть хеш                         Есть массив    
81090        0,25               810902*   
810902      0,7                 8109058*
У меня при поиске оба значения попадают под первый ключ.
Пытаюсь foreach (grep /^$кеу/,@arrow)
Как сделать поиск максимального соответствия?
Заранее спасибо.

Автор: arto 8.1.2009, 19:54
отсортировать по длине и сравнивать

Автор: amg 9.1.2009, 07:50
CiH, Не вполне понятно, что в Вашем случае означает поиск максимального соответствия.
У меня есть функции для работы с сокращенными словами. Может, они окажутся полезными.
Код
@array = qw(810902* 8109058*);
%hash = (81090=>0.25, 810902=>0.7);
foreach (keys %hash) {
  print $_, ': ', extended_word($_,@array), "\n";
}

# Принимает сокращенное слово (в начале) и полные слова плоским списком
# Возвращает полное слово, соответствующее сокращенному
sub extended_word {
  my $x = shift;
  my $min_rest = 1e10;
  my $a;
  foreach (@_) {
    m/^$x(.*)/ or next;
    my $l = length $1;
    if ($l < $min_rest) {
      $min_rest = $l;
      $a = $_;
    }
  }
  return defined $a ? $a : $x;
}

# Принимает массив слов
# Возвращает массив сокращенных слов
sub shrunk_words {
  my @b = @_;
  NEW_WORD:
  for ($i=0; $i<@b; $i++) {
    my $last_letter = '';
    while (length($b[$i]) != 1) {
      for ($j=0; $j<@b; $j++) {
        next if $j==$i;
        if ($b[$j] =~ /^$b[$i]/) {
          $b[$i] .= $last_letter;
          next NEW_WORD;
        }
      }
      $last_letter = substr $b[$i], -1, 1, '';
    }
  }
  return @b;
}


Автор: CiH 9.1.2009, 11:52
Хэш-это код страны - цена. Массив - биллинг с нашей АСТ. Нужно в исходящих звонках найти код страны и подставить стоимость звонка.

arto, у меня была такая мысль, но думал может есть более простое решение. Ключей-то более тысячи а в массиве более 100 000 записей (пока). Тут скорее брать построчно из массива первые х символов и уменьшать на  один пока не найдет в хэше?

amg, спасибо. Но кажется это не то.

А есть ещё идеи?

Автор: ginnie 11.1.2009, 20:16
Цитата(CiH @  9.1.2009,  11:52 Найти цитируемый пост)
Тут скорее брать построчно из массива первые х символов и уменьшать на  один пока не найдет в хэше?

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

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