Veri sıkıştırma modülünü yazmaya başladım, şu an için doğru çalışıyor gibi görünüyor, en kısa zamanda birim testleri ekleyeceğim. Şu haliyle nasıl görünüyor?
module huffman;
import std.algorithm;
import std.stdio;
import std.conv;
struct Node
{
private
{
dstring value_;
int binaryCode_;
int frequence_;
Node* right_;
Node* left_;
}
public this(const int frequence, dstring value)
{
value_ = value;
frequence_ = frequence;
}
public int opCmp(Node another) const
{
return (frequence_ - another.frequence_);
}
public dstring toString() const
{
dstring result;
result ~= "Binary code: " ~ to!dstring(binaryCode_) ~ "\n";
result ~= "Letter: " ~ value_ ~ "\n";
return result;
}
public void setBinaryCodes()
{
if(right_ && left_)
{
right_.binaryCode_ = binaryCode_;
left_.binaryCode_ = binaryCode_;
right_.binaryCode_ <<= 1;
left_.binaryCode_ <<= 1;
left_.binaryCode_ |= 1;
right_.setBinaryCodes();
left_.setBinaryCodes();
}
}
public int[dstring] returnTable()
{
int[dstring] result;
result[value_] = binaryCode_;
if(right_ && left_)
{
foreach(index, value; left_.returnTable()){
result[index] = value;
}
foreach(index, value; right_.returnTable()){
result[index] = value;
}
}
return result;
}
}
Node[] searchLetters(dstring text)
{
int[dchar] letters;
Node[] result;
foreach(character; text){
if(character in letters){
++letters[character];
} else {
letters[character] = 1;
}
}
foreach(index, value; letters){
result ~= Node(value, to!dstring(index));
}
return result;
}
Node createTree(Node[] nodes)
{
while(nodes.length > 1)
{
nodes.sort();
auto newNode = Node((nodes[0].frequence_ + nodes[1].frequence_), (nodes[0].value_ ~ nodes[1].value_));
newNode.left_ = &nodes[0];
newNode.right_ = &nodes[1];
nodes ~= newNode;
nodes = nodes[2 .. $];
}
return nodes[0];
}
void main()
{
dstring text = "Hello World";
auto top = createTree(searchLetters(text));
top.setBinaryCodes();
writeln(top.returnTable());
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]