PDA

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


eden
09.01.2010, 20:34
Доброго времени суток. Пишу программу, которая должна кодировать введенную строку по методу Хаффмана, вот пока что получилось:

#!/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 :-))
?

krypt3r
12.01.2010, 08:59
Не знаю, как вы со CPAN-а поставили модуль, который не проходит make test. Строка в примере

my %char_counting = map {$_ => int rand(100)} ('a' .. 'z', 'A' .. 'Z');

правильная, формируется хэш, ссылка на который и передается конструктору new. Имхо, фтопку модуль, ищите другие варианты, в гугле куча ссылок

eden
12.01.2010, 14:17
Все эти ссылки ссылаются на этот же модуль со cpan.org, как отладить тогда существующий?

eden
13.01.2010, 04:51
Проблем решена. Нашел другое решение в сети: http://eli.thegreenplace.net/files/prog_code/huff.pl.txt
krypt3r, Pashkela - спасибо за помощь.