[Perl] Кодирование строки по Хаффману

Discussion in 'PHP' started by eden, 9 Jan 2010.

  1. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Доброго времени суток. Пишу программу, которая должна кодировать введенную строку по методу Хаффмана, вот пока что получилось:

    Code:
    #!/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";
        }
    }
    Каким образом мне дальше действовать? использовать хеш таблицу или что то другое? язык для меня новый и все его возможности я пока незнаю.
    И если есть возможность как то упростить задачу, буду рад предложениям.

    Спасибо за внимание!
     
    #1 eden, 9 Jan 2010
    Last edited: 9 Jan 2010
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm
     
  3. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Установил Heap::Fibonacci, но выдает ошибку:

    Code:
    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.
    как исправить?
     
    #3 eden, 10 Jan 2010
    Last edited: 10 Jan 2010
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    вообще-то там все написано, чего не хватает и где именно.
     
  5. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    ну после установки модуля Fibonacci, я не нашел файл Heap/Fibonacci.pm, который запрашивается в ошибке
     
    #5 eden, 10 Jan 2010
    Last edited: 10 Jan 2010
  6. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Все, с модулями разобрался, установил вроде все требуемые.
    Когда запускаю программу на выполнение пишет:

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

    Code:
    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;
    }
    Что это за ошибка?
     
  7. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    http://www.cpan.org/modules/
    Здесь вообще могут быть модули с ошибками?
     
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    вряд ли. Лучше почитай, как правильно устанавливать модули
     
  9. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Читал, модули я поставил верно, но при интерпретации алгоритма(файл Huffman.pm) с cpan.org пишет: Not a HASH reference, и как мне исправить эту ошибку, и вообще должна ли она появлятся в подобном случае?

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

    1. Перешел по ссылке http://search.cpan.org/dist/Algorithm-Huffman/Huffman.pm скопировал в файл haffman.pl код с этого сайта:
    Code:
      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 выдает код ошибки:
    Code:
     Not a HASH reference at /usr/local/share/perl/5.10.0/Algorithm/Huffman.pm line 198.
    Вот собственно и вся ошибка.
    Кому будет не сложно повторите эти действия, может дело в самом модуле Algorithm::Huffman и имеет смысл писать свой собственный?
     
  10. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Подскажите как исправить это предупреждение, о плохой работе алгоритма:
    Code:
      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 :-))
    ?
     
  11. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Не знаю, как вы со CPAN-а поставили модуль, который не проходит make test. Строка в примере
    Code:
    my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');
    
    правильная, формируется хэш, ссылка на который и передается конструктору new. Имхо, фтопку модуль, ищите другие варианты, в гугле куча ссылок
     
  12. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Все эти ссылки ссылаются на этот же модуль со cpan.org, как отладить тогда существующий?
     
  13. eden

    eden New Member

    Joined:
    9 Jan 2010
    Messages:
    26
    Likes Received:
    1
    Reputations:
    0
    Проблем решена. Нашел другое решение в сети: http://eli.thegreenplace.net/files/prog_code/huff.pl.txt
    krypt3r, Pashkela - спасибо за помощь.