https://github.com/niklasf/rust-huffman-compress
A Rust library for Huffman compression given a propability distribution over arbitrary symbols
https://github.com/niklasf/rust-huffman-compress
compression huffman-coding rust
Last synced: 2 months ago
JSON representation
A Rust library for Huffman compression given a propability distribution over arbitrary symbols
- Host: GitHub
- URL: https://github.com/niklasf/rust-huffman-compress
- Owner: niklasf
- License: apache-2.0
- Created: 2018-01-28T23:57:20.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2023-12-22T22:18:43.000Z (over 1 year ago)
- Last Synced: 2024-05-01T18:58:03.882Z (about 1 year ago)
- Topics: compression, huffman-coding, rust
- Language: Rust
- Homepage: https://docs.rs/huffman-compress
- Size: 48.8 KB
- Stars: 24
- Watchers: 3
- Forks: 8
- Open Issues: 7
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE-APACHE
Awesome Lists containing this project
README
huffman-compress
================[Huffman compression](https://en.wikipedia.org/wiki/Huffman_coding)
given a probability distribution over arbitrary symbols.[](https://travis-ci.org/niklasf/rust-huffman-compress)
[](https://crates.io/crates/huffman-compress)
[](https://docs.rs/huffman-compress)
[](#Alternatives)Alternatives
------------This project has limited real-world utility. It may be useful to experiment
with or learn about Huffman coding
(for example, when working on
[bespoke chess game compression for lichess.org](https://github.com/lichess-org/compression)),
but there are better entropy coders (both in terms of compression ratio
and performance) and better implementations.See [`constriction`](https://crates.io/crates/constriction) for composable
entropy coders, models and streams.See [`arcode`](https://crates.io/crates/arcode) for a standalone implementation
of arithmetic coding.Examples
--------```rust
use std::iter::FromIterator;
use std::collections::HashMap;
use bit_vec::BitVec;
use huffman_compress::{CodeBuilder, Book, Tree};let mut weights = HashMap::new();
weights.insert("CG", 293);
weights.insert("AG", 34);
weights.insert("AT", 4);
weights.insert("CT", 4);
weights.insert("TG", 1);// Construct a Huffman code based on the weights (e.g. counts or relative
// frequencies).
let (book, tree) = CodeBuilder::from_iter(weights).finish();// More frequent symbols will be encoded with fewer bits.
assert!(book.get("CG").map_or(0, |cg| cg.len()) <
book.get("AG").map_or(0, |ag| ag.len()));// Encode some symbols using the book.
let mut buffer = BitVec::new();
let example = vec!["AT", "CG", "AT", "TG", "AG", "CT", "CT", "AG", "CG"];
for symbol in &example {
book.encode(&mut buffer, symbol);
}// Decode the symbols using the tree.
let decoded: Vec<&str> = tree.decoder(&buffer).collect();
assert_eq!(decoded, example);
```Documentation
-------------[Read the documentation](https://docs.rs/huffman-compress)
Changelog
---------* 0.6.1
- Fix deprecation warning and remove `#[deny(warnings)]` (a future
compatibility hazard in libraries).
* 0.6.0
- Update to `bit-vec` 0.6.
* 0.5.0
- Update to `bit-vec` 0.5.
* 0.4.0
- Renamed `Tree::decoder()` to `Tree::unbounded_decoder()` to avoid
surprises. A new `Tree::decoder()` takes the maximum number of symbols to
decode.
- No longer reexporting `Saturating` from num-traits.
* 0.3.2
- Preallocate arena space for Huffman tree.
* 0.3.1
- Update num-traits to 0.2 (semver compatible).
* 0.3.0
- Introduce `CodeBuilder`.
- Changes tie breaking order.
* 0.2.0
- Allow initialization from iterators without creating a `HashMap`. Thanks
@mernen.
- Require `K: Ord` instead of `K: Hash + Eq` for symbols and switch `Book`
internals from `HashMap` to `BTreeMap`.
- Specify stability guarantees.
* 0.1.1
- Expose more methods on `Book`.
* 0.1.0
- Initial release.License
-------huffman-compress is dual licensed under the [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
and [MIT](http://opensource.org/licenses/MIT) license, at your option.