Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   PHP, PERL, MySQL, JavaScript (https://forum.antichat.xyz/forumdisplay.php?f=37)
-   -   [Perl] Кодирование строки по Хаффману (https://forum.antichat.xyz/showthread.php?t=169521)

eden 09.01.2010 20:34

[Perl] Кодирование строки по Хаффману
 
Доброго времени суток. Пишу программу, которая должна кодировать введенную строку по методу Хаффмана, вот пока что получилось:

Код:

#!/usr/bin/perl -w

print "Введите строку: ";
$string = <STDIN>;
chomp $string;

# Заполняем массив @symbols символами из строки
@symbols = split(//, $string);
for ($a = 0; $a < @symbols; $a++) {
    $number[$a] = 0;
}

# Считаем частоту символов в строке
for ($i = 0; $i < @symbols-1; $i++) {
  if ($number[$i] == 0) {
      $count = 1;
      $number[$i] = 1;
      $t = $i + 1;
      print $t;
      for ($j = $t; $j < @symbols; $j++) {
          $one = substr($string,$i,1);
          $two = substr($string,$j,1);
          if  ( ($one eq $two) and ($number[$j] == 0) ) {
              $number[$j] = 1;
              $count++;
             
          }
      }
      $tmp = substr($string,$i,1);
      print "$tmp - $count\n";
    }
}

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

Спасибо за внимание!

Pashkela 10.01.2010 09:40

http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm

eden 10.01.2010 19:35

Установил Heap::Fibonacci, но выдает ошибку:

Код:

Can't locate Heap/Fibonacci.pm in @INC (@INC contains: /etc/perl

/usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0
 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10
/usr/local/lib/site_perl .) at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 14.
BEGIN failed--compilation aborted at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 14.
Compilation failed in require at haffman.pl line 3.
BEGIN failed--compilation aborted at haffman.pl line 3.

как исправить?

Pashkela 10.01.2010 19:39

вообще-то там все написано, чего не хватает и где именно.

eden 10.01.2010 19:49

ну после установки модуля Fibonacci, я не нашел файл Heap/Fibonacci.pm, который запрашивается в ошибке

eden 10.01.2010 22:54

Все, с модулями разобрался, установил вроде все требуемые.
Когда запускаю программу на выполнение пишет:

Код:

Not a HASH reference at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 198.
Открываю файл Huffman.pm:

Код:

sub new {
  my ($proto, $key, $value) = @_;
  my $class = ref($proto) || $proto;

  my $self = $class->SUPER::new;

  $self->{"KeyValuePair::key"}  = $key;        # строка 198
  $self->{"KeyValuePair::value"} = $value;
 
  return $self;
}

Что это за ошибка?

eden 11.01.2010 19:41

http://www.cpan.org/modules/
Здесь вообще могут быть модули с ошибками?

Pashkela 11.01.2010 22:31

вряд ли. Лучше почитай, как правильно устанавливать модули

eden 12.01.2010 00:27

Читал, модули я поставил верно, но при интерпретации алгоритма(файл Huffman.pm) с cpan.org пишет: Not a HASH reference, и как мне исправить эту ошибку, и вообще должна ли она появлятся в подобном случае?

Мои предыдущие действия были такие:

1. Перешел по ссылке http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm скопировал в файл haffman.pl код с этого сайта:
Код:

  use Algorithm::Huffman;

  my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
  # or better the real counting for your characters
  # as the huffman algorithm doesn't work good with random data :-))

  my $huff = Algorithm::Huffman->new(\%char_counting);
  my $encode_hash = $huff->encode_hash;
  my $decode_hash = $huff->decode_hash;

  my $encode_of_hello = $huff->encode_bitstring("Hello");

  print "Look at the encoding bitstring of 'Hello': $encode_of_hello\n";
  print "The decoding of $encode_of_hello is '", $huff->decode_bitstring($encode_of_hello), "'";

2. Установил через CPAN модуль Algorithm::Huffman
3. После команды: perl haffman.pl выдает код ошибки:
Код:

Not a HASH reference at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 198.
Вот собственно и вся ошибка.
Кому будет не сложно повторите эти действия, может дело в самом модуле Algorithm::Huffman и имеет смысл писать свой собственный?

eden 12.01.2010 05:39

Подскажите как исправить это предупреждение, о плохой работе алгоритма:
Код:

  my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
  # or better the real counting for your characters
  # as the huffman algorithm doesn't work good with random data :-))

?


Время: 00:27