Skip to content

Conversation

@jesper-olsen
Copy link
Contributor

Description

This PR improves the robustness of the Huffman encoding implementation by properly handling edge cases that previously caused undefined behavior or panics.

Summary of changes:

  • Changed HuffmanDictionary::new() to return Option<Self> for safer API design
  • Added proper handling for empty alphabets (returns None instead of panicking)
  • Added special case handling for single-symbol alphabets, which previously failed during tree construction
  • Improved error handling in decode() by replacing unwrap() calls with ? operator
  • Added #[inline(always)] optimization for the frequently-called get_bit() method
  • Added comprehensive documentation with usage examples
  • Added tests for edge cases (empty and single-symbol inputs)

The Huffman encoding algorithm is a well-known lossless data compression algorithm. More details: https://en.wikipedia.org/wiki/Huffman_coding

Note: During development, I observed intermittent heap corruption errors in the test suite that occur even without these changes, suggesting pre-existing issues in the codebase.

Type of change

Please delete options that are not relevant.

  • Bug fix (non-breaking change which fixes an issue)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)

Checklist:

  • I ran bellow commands using the latest version of rust nightly.
  • I ran cargo clippy --all -- -D warnings just before my last commit and fixed any issue that was found.
  • I ran cargo fmt just before my last commit.
  • I ran cargo test just before my last commit and all tests passed.
  • I added my algorithm to the corresponding mod.rs file within its own folder, and in any parent folder(s).
  • I added my algorithm to DIRECTORY.md with the correct link.
  • I checked CONTRIBUTING.md and my code follows its guidelines.

Please make sure that if there is a test that takes too long to run ( > 300ms), you #[ignore] that or
try to optimize your code or make the test easier to run. We have this rule because we have hundreds of
tests to run; If each one of them took 300ms, we would have to wait for a long time.

- Change HuffmanDictionary::new() to return Option<Self> for safer API
- Add proper handling for empty alphabet (returns None)
- Add special case handling for single-symbol alphabets
- Replace unwrap() calls with ? operator in decode() for better error handling
- Add #[inline(always)] optimization for frequently called get_bit()
- Add comprehensive tests for edge cases
- Improve documentation with usage examples

BREAKING CHANGE: HuffmanDictionary::new() now returns Option<Self>
@codecov-commenter
Copy link

codecov-commenter commented Sep 23, 2025

Codecov Report

❌ Patch coverage is 98.95833% with 1 line in your changes missing coverage. Please review.
✅ Project coverage is 95.33%. Comparing base (f2a23e9) to head (d64d56d).

Files with missing lines Patch % Lines
src/general/huffman_encoding.rs 98.95% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #912      +/-   ##
==========================================
+ Coverage   95.32%   95.33%   +0.01%     
==========================================
  Files         319      319              
  Lines       20807    20890      +83     
==========================================
+ Hits        19834    19916      +82     
- Misses        973      974       +1     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Adds two new test cases to ensure 100% patch coverage for HuffmanEncoding::decode:
1. test_decode_empty_encoding_struct: Covers the edge case where num_bits == 0.
2. minimal_decode_end_check: Ensures the final 'if self.num_bits > 0' check in the multi-symbol decode path is fully covered.
Corrects 'char-lit-as-u8' and 'unnecessary-cast' lints in the newly added coverage tests to satisfy GitHub Actions.
Copy link
Member

@vil02 vil02 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change looks good. One minor thing below.

@vil02 vil02 merged commit aa3194f into TheAlgorithms:master Sep 26, 2025
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants