Content deleted Content added
m v1.38b - WP:WCW project (Unicode control characters) |
IznoRepeat (talk | contribs) m add WP:TEMPLATECAT to remove from template; genfixes |
||
(44 intermediate revisions by 32 users not shown) | |||
Line 1:
{{short description|Data compression technique}}
'''Adaptive Huffman coding''' (also called '''Dynamic Huffman coding''') is an [[adaptive coding]] technique based on [[Huffman coding]]. It permits building the code as the symbols are being transmitted, having no initial knowledge of source distribution, that allows one-pass encoding and adaptation to changing conditions in data.<ref name="LiDrew2014">{{cite book|author1=Ze-Nian Li|author2=Mark S. Drew|author3=Jiangchuan Liu|title=Fundamentals of Multimedia|url=https://books.google.com/books?id=R6vBBAAAQBAJ|date=9 April 2014|publisher=Springer Science & Business Media|isbn=978-3-319-05290-8}}</ref>
The benefit of one-pass procedure is that the source can be encoded in real time, though it becomes more sensitive to transmission errors, since just a single loss ruins the whole code, requiring [[error detection and correction]].
==Algorithms==
Line 7 ⟶ 8:
===FGK Algorithm ===
It is an online coding technique based on Huffman coding. Having no initial knowledge of occurrence frequencies, it permits dynamically adjusting the Huffman's tree as data are being transmitted. In a FGK Huffman tree, a special external node, called ''0-node'', is used to identify a newly
Since the FGK Algorithm has some drawbacks about the node-or-subtree swapping, Vitter proposed another algorithm to improve it.
Line 13 ⟶ 14:
===Vitter algorithm===
Some important terminologies & constraints :-
* '''Implicit Numbering''' :
* '''Invariant''' : For each weight w, all leaves of weight w precede all internal nodes having weight w. In other terms, when we have built the Huffman tree, if several nodes had the same value, we prioritized merging the leaves over the internal nodes.
* '''Blocks''' : Nodes of same weight and same type (i.e. either leaf node or internal node) form a Block.
* '''Leader''' : Highest numbered node in a block.
Line 23:
A leaf block always precedes internal block of same weight, thus maintaining the invariant.
'''NYT (Not Yet Transferred)''' is a special node
[[File:Leaf step one.png|thumb|Slide_And_Increment(leaf node) sliding starts. P is a leaf node.]]
[[File:Leaf step two.png|thumb|Slide_And_Increment(leaf node) sliding step 2. As P is leaf node, it slides in front of next block nodes of equal weight.]]
[[File:Leaf step three.png|thumb|Slide_And_Increment(leaf node) sliding step 3. Here we increase the current weight by 1.]]
[[File:Leaf step four.png|thumb|Slide_And_Increment(leaf node) sliding step 4. Method comes to an end. P is the new parent.]]
[[File:Internal one.png|thumb|Slide_And_Increment(internal node) sliding starts. P is an internal node.]]
[[File:Internal two.png|thumb|Slide_And_Increment(internal node) sliding step 2. Node P slides in front of next block of leaves nodes, with weight wt+1.]]
[[File:Internal three.png|thumb|Slide_And_Increment(internal node) sliding step 3. Now we increase the weight to 9. Thus the '''''invariant is maintained''''' as the current node is an internal node and should occur in front of leaf nodes of equal weight as we have increased the weight.]]
[[File:Internal four.png|thumb|Slide_And_Increment(internal node) sliding step 4. Now the 'P' points to the former parent ( as in the case of internal node according to algorithm)]]
'''algorithm''' for adding a symbol '''is'''
leaf_to_increment := NULL
p := pointer to the leaf node containing the next symbol
'''if''' (p is NYT) '''then'''
Extend p by adding two children
Left child becomes new NYT and right child is the new symbol leaf node
''p'' := parent of new symbol leaf node
leaf_to_increment := Right Child of p
'''else'''
Swap p with leader of its block
'''if''' (new p is sibling to NYT) '''then'''
leaf_to_increment := p
''p'' := parent of p
'''while''' (p ≠ NULL) '''do'''
Slide_And_Increment(p)
'''if''' (leaf_to_increment != NULL) '''then'''
Slide_And_Increment(leaf_to_increment)
previous_p := parent of ''p''
'''if''' (p is an internal node) '''then'''
Slide p in the tree higher than the leaf nodes of weight wt + 1
increase weight of ''p'' by 1
''p'' := previous_p
'''else'''
Slide p in the tree higher than the internal nodes of weight wt
increase weight of ''p'' by 1
''p'' := new parent of ''p''.
Encoder and decoder start with only the root node, which has the maximum number. In the beginning it is our initial NYT node.
Line 131 ⟶ 75:
====Example====
[[File:Adaptive Huffman Vitter.jpg|800px]]
Encoding "abb" gives 01100001 001100010 11.
Step 1:
Line 149 ⟶ 93:
Step 3:
NYT spawns two child nodes: 252 for NYT and 253 for leaf node, both with weight 0. Increase weights for 253, 254, and root. To maintain
For the second "b" transmit 11.
Step 4:
Go to leaf node 253. Notice we have two blocks with weight 1. Node 253 and 254 is one block (consisting of leaves), node 255 is another block (consisting of internal nodes). For node 253, the biggest number in its block is 254, so swap the weights and symbols of nodes 253 and 254. Now node 254 and the branch starting from node 255 satisfy the SlideAndIncrement condition<ref name=":0"
Future code for "b" is 1, and for "a" is now 01, which reflects their frequency.
Line 165 ⟶ 109:
{{reflist}}
* Vitter's original paper: J. S. Vitter, "[http://www.
* J. S. Vitter, "ALGORITHM 673 Dynamic Huffman Coding", ACM Transactions on Mathematical Software, 15(2), June 1989, pp 158–167. Also appears in Collected Algorithms of ACM.
* Donald E. Knuth, "Dynamic Huffman Coding", Journal of Algorithm, 6(2), 1985, pp 163–180.
Line 173 ⟶ 117:
* [http://www.ics.uci.edu/~dan/pubs/DC-Sec4.html University of California Dan Hirschberg site]
* [http://www.cs.cf.ac.uk/Dave/Multimedia/node212.html Cardiff University Dr. David Marshall site]
* [
* [http://www.cs.duke.edu/csed/curious/compression/adaptivehuff.html Excellent description from Duke University]
Line 179 ⟶ 123:
[[Category:Lossless compression algorithms]]
[[Category:Data compression]]
|