in reply to Huffman coding in pure Perl

The main inefficiency is that bit operations are not really bit operations; rather, the module uses ASCII strings of 0s and 1s, and only packs it into a real bit string after the encoded string has been constructed. ...

On the encoding side, it is only slightly harder to build the bit vector directly, using vec() instead of pack 'b'.

sub huff1 { my ( $string, $codes) = @_; my ( $ret, $len) = ( '', 0); # $len counts bits for ( split( //, $string), '_eos' ) { vec( $ret, $len ++, 1) = $_ for split //, $codes->{ $_}; } return $ret; }
The decoding side is harder.

Update: No, it isn't. Dehuff is as easily adapted to vec().

sub dehuff1 { my ( $string, $code) = @_; my %decode = reverse %$code; my ( $ret, $c, $where) = ( '', '', 0); while ( 1 ) { $c .= vec( $string, $where ++, 1); next unless exists $decode{ $c}; last if $decode{ $c} eq '_eos'; $ret .= $decode{ $c}; $c = ''; } return $ret; }

Anno

Replies are listed 'Best First'.
Re^2: Huffman coding in pure Perl
by vrk (Chaplain) on Mar 04, 2007 at 19:46 UTC

    I know. I originally had vec in mind, but doing the decoding that way felt like too much of a drag, and I don't really need this module. The current implementation is arguably easier to understand, which was what I wanted to do: understand the algorithm.

    --
    print "Just Another Perl Adept\n";