huffman 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,22 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+ describe "HuffmanCoder" do
5
+ it "decode an encoded string and get back the original string" do
6
+ txt = "La vie est un long fleuve tranquille avec des impasses, des courants de mer"
7
+ encoded_text, dictionnary = Huffman.encode_text(txt)
8
+ new_txt = Huffman.decode_text(encoded_text,dictionnary)
9
+ new_txt.should == txt
10
+ end
11
+
12
+ it "decode an encoded file and get back the original file" do
13
+
14
+ file_name = "spec/data/miserables.txt"
15
+ original_content = File.read(file_name)
16
+ Huffman.encode_file(file_name)
17
+ Huffman.decode_file(file_name+".huffman-encoded",file_name+".huffman-dictionnary")
18
+ original_content_after_decoding = File.read(file_name+".huffman-encoded-back-to-original")
19
+ original_content.should == original_content_after_decoding
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ require "spec_helper.rb"
2
+
3
+ describe "LetterFrequency" do
4
+
5
+ it "get the sorted frequencies of the characters of a text" do
6
+
7
+ # Create an hash (associative array) with random letters frequencies
8
+ #
9
+ # a => 1
10
+ # b => 8
11
+ # c => 9
12
+
13
+ frequencies = {}
14
+ ('a'..'z').each{|c| frequencies[c] = rand(1..100) }
15
+ # Create a string from the frequencies hash
16
+ txt = frequencies.map{|letter,freq| letter*freq}.join.split('').shuffle.join
17
+ # Test
18
+ # On tries les frequences pour pouvoir comparer les hashs
19
+ Huffman::LetterFrequency.get_frequencies(txt).sort_by{|h| [h[1], h[0]]}.should == frequencies.sort_by{|h| [h[1], h[0]]}
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,43 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+
5
+ describe Node do
6
+
7
+ context "with a particular binary tree" do
8
+ # We consider the tree example in the Readme
9
+ # 1
10
+ # / \
11
+ # 2 3
12
+ # / \ \
13
+ # 4 5 6
14
+ # / \ /
15
+ # 7 8 9
16
+
17
+ # Left part
18
+ n7 = Node.new(7)
19
+ n8 = Node.new(8)
20
+ n5 = Node.new(5,nil,n7,n8)
21
+ n4 = Node.new(4)
22
+ n2 = Node.new(2,nil,n4,n5)
23
+ # Right part
24
+ n9 = Node.new(9,nil)
25
+ n6 = Node.new(6,nil,n9)
26
+ n3 = Node.new(3,nil,nil,n6)
27
+ # Tree
28
+ tree = Node.new(1,nil,n2,n3)
29
+
30
+ it "can be visited by the preorder algorithm" do
31
+ tree.visit_and_map(:preorder){|node| node.value}.should == [1, 2, 4, 5, 7, 8, 3, 6, 9]
32
+ end
33
+ it "can be visited by the inorder algorithm" do
34
+ tree.visit_and_map(:inorder){|node| node.value}.should == [4, 2, 7, 5, 8, 1, 3, 9, 6]
35
+ end
36
+ it "can be visited by the postorder algorithm" do
37
+ tree.visit_and_map(:postorder){|node| node.value}.should == [4, 7, 8, 5, 2, 9, 6, 3, 1]
38
+ end
39
+
40
+ end
41
+ end
42
+
43
+ end
@@ -0,0 +1,41 @@
1
+ require "spec_helper.rb"
2
+
3
+ module Huffman
4
+ describe Tree do
5
+ context "with an expected binary tree" do
6
+ txt = "ABBCCCDDDEEEEE"
7
+ # Fréquences : A1 B2 C3 D3 E5
8
+ frequencies = LetterFrequency.get_frequencies(txt)
9
+ tree = Tree.new(frequencies)
10
+ # 14
11
+ # / \
12
+ # 6 8
13
+ # / \ / \
14
+ # 3 3 3 5
15
+ # / \
16
+ # 1 2
17
+ node3 = Node.new(3,nil,Node.new(1),Node.new(2))
18
+ node6 = Node.new(6,nil,Node.new(3),node3)
19
+ node8 = Node.new(8,nil,Node.new(3),Node.new(5))
20
+ expected_tree = Node.new(14,nil,node6,node8)
21
+
22
+ xit "build a tree from frequencies" do
23
+ tree.visit_and_map(:postorder){|node| node.value}.should == expected_tree.visit_and_map(:postorder){|node| node.value}
24
+
25
+ # Important, en fait il est difficile et plus compliquer de comparer deux arbres binaires
26
+ # dans le contexte d'un codage de Huffman
27
+ # Car deux arbres peuvent êtres structurellement différents mais pareil pour le codage de Huffman
28
+ # Cela dépend donc dans quel ordre a été triés les noeuds de même valeur
29
+ # Celà influence sur la structure de l'arbre
30
+ end
31
+
32
+ it "build and get the right dictionnary" do
33
+ dict = tree.dictionnary
34
+
35
+ #expected_dict = {"00"=>"C", "01"=>"D", "100"=>"A", "101"=>"B", "11"=>"E"}
36
+ expected_dict = {"00"=>"C", "010"=>"A", "011"=>"B", "10"=>"D", "11"=>"E"}
37
+ dict.should == expected_dict
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ require "huffman.rb"
2
+ #require 'simplecov'
3
+ #SimpleCov.start
4
+
5
+ # This file was generated by the `rspec --init` command. Conventionally, all
6
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
7
+ # Require this file using `require "spec_helper"` to ensure that it is only
8
+ # loaded once.
9
+ #
10
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
11
+ RSpec.configure do |config|
12
+ config.treat_symbols_as_metadata_keys_with_true_values = true
13
+ config.run_all_when_everything_filtered = true
14
+ config.filter_run :focus
15
+
16
+ # Run specs in random order to surface order dependencies. If you find an
17
+ # order dependency and want to debug it, you can fix the order by providing
18
+ # the seed, which is printed after each run.
19
+ # --seed 1234
20
+ config.order = 'random'
21
+ end
metadata ADDED
@@ -0,0 +1,173 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: huffman
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Martin Lagrange
8
+ - Bastien Jorge
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-16 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ~>
19
+ - !ruby/object:Gem::Version
20
+ version: '1.3'
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ version: '1.3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: rake
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - '>='
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rspec
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - '>='
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: ruby-graphviz
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - '>='
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - '>='
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: PriorityQueue
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - '>='
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :runtime
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: This gem allow you to encode and decode a text using the Huffman encoding
99
+ compression algorithm. It can also generate and visualize the huffman tree as a
100
+ png file.
101
+ email:
102
+ - lagrangemartin@gmail.com
103
+ - bastien.jorge@gmail.com
104
+ executables: []
105
+ extensions: []
106
+ extra_rdoc_files: []
107
+ files:
108
+ - .DS_Store
109
+ - .gitattributes
110
+ - .gitignore
111
+ - .rspec
112
+ - .ruby-version
113
+ - .travis.yml
114
+ - Gemfile
115
+ - LICENSE.txt
116
+ - README.md
117
+ - Rakefile
118
+ - huffman.gemspec
119
+ - lib/.DS_Store
120
+ - lib/huffman.rb
121
+ - lib/huffman/binary_stream.rb
122
+ - lib/huffman/letter_frequency.rb
123
+ - lib/huffman/log.rb
124
+ - lib/huffman/node.rb
125
+ - lib/huffman/tree.rb
126
+ - lib/huffman/version.rb
127
+ - spec/.DS_Store
128
+ - spec/data/.DS_Store
129
+ - spec/data/miserables.txt
130
+ - spec/data/miserables.txt.huffman-dictionnary
131
+ - spec/data/miserables.txt.huffman-encoded
132
+ - spec/data/miserables.txt.huffman-encoded-back-to-original
133
+ - spec/lib/huffman_spec.rb
134
+ - spec/lib/letter_frequency_spec.rb
135
+ - spec/lib/node_spec.rb
136
+ - spec/lib/tree_spec.rb
137
+ - spec/spec_helper.rb
138
+ homepage: http://github.com/lagrangemartin/huffman
139
+ licenses:
140
+ - MIT
141
+ metadata: {}
142
+ post_install_message:
143
+ rdoc_options: []
144
+ require_paths:
145
+ - lib
146
+ required_ruby_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - '>='
154
+ - !ruby/object:Gem::Version
155
+ version: '0'
156
+ requirements: []
157
+ rubyforge_project:
158
+ rubygems_version: 2.0.3
159
+ signing_key:
160
+ specification_version: 4
161
+ summary: Encode and decode a text using the Huffman encoding compression algorithm.
162
+ test_files:
163
+ - spec/.DS_Store
164
+ - spec/data/.DS_Store
165
+ - spec/data/miserables.txt
166
+ - spec/data/miserables.txt.huffman-dictionnary
167
+ - spec/data/miserables.txt.huffman-encoded
168
+ - spec/data/miserables.txt.huffman-encoded-back-to-original
169
+ - spec/lib/huffman_spec.rb
170
+ - spec/lib/letter_frequency_spec.rb
171
+ - spec/lib/node_spec.rb
172
+ - spec/lib/tree_spec.rb
173
+ - spec/spec_helper.rb