Доброе утро, всем форумчанам!! Есть класс на C#:
C# |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
| class HuffmanTree
{
private List<Node> nodes = new List<Node>();
public Node Root { get; set; }
public Dictionary<char, int> Frequencies = new Dictionary<char, int>();
public void Build(string source)
{
for (int i = 0; i < source.Length; i++)
{
if (!Frequencies.ContainsKey(source[i]))
{
Frequencies.Add(source[i], 0);
}
Frequencies[source[i]]++;
}
foreach (KeyValuePair<char, int> symbol in Frequencies)
{
nodes.Add(new Node() { Symbol = symbol.Key, Frequency = symbol.Value });
}
while (nodes.Count > 1)
{
List<Node> orderedNodes = nodes.OrderBy(node => node.Frequency).ToList<Node>();
if (orderedNodes.Count >= 2)
{
// Take first two items
List<Node> taken = orderedNodes.Take(2).ToList<Node>();
// Create a parent node by combining the frequencies
Node parent = new Node()
{
Symbol = '*',
Frequency = taken[0].Frequency + taken[1].Frequency,
Left = taken[0],
Right = taken[1]
};
nodes.Remove(taken[0]);
nodes.Remove(taken[1]);
nodes.Add(parent);
}
this.Root = nodes.FirstOrDefault();
}
}
public BitArray Encode(string source)
{
List<bool> encodedSource = new List<bool>();
for (int i = 0; i < source.Length; i++)
{
List<bool> encodedSymbol = this.Root.Traverse(source[i], new List<bool>());
encodedSource.AddRange(encodedSymbol);
}
BitArray bits = new BitArray(encodedSource.ToArray());
return bits;
}
public string Decode(BitArray bits)
{
Node current = this.Root;
string decoded = "";
foreach (bool bit in bits)
{
if (bit)
{
if (current.Right != null)
{
current = current.Right;
}
}
else
{
if (current.Left != null)
{
current = current.Left;
}
}
if (IsLeaf(current))
{
decoded += current.Symbol;
current = this.Root;
}
}
return decoded;
}
public bool IsLeaf(Node node)
{
return (node.Left == null && node.Right == null);
}
} |
|
Я перевел его на C++/CLI
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
| using namespace System;
private ref class HuffmanTree
{
private:
List<Node^> ^nodes = gcnew List<Node^>();
public:
property Node ^Root;
Dictionary<Char, int> ^Frequencies = gcnew Dictionary<Char, int>();
void Build(String ^source)
{
for (int i = 0; i < source->Length; i++)
{
if (!Frequencies->ContainsKey(source[i]))
{
Frequencies->Add(source[i], 0);
}
Frequencies[source[i]]++;
}
for each (KeyValuePair<Char, int> ^symbol in Frequencies)
{
Node ^tempVar = gcnew Node();
tempVar->Symbol = symbol.Key;
tempVar->Frequency = symbol.Value;
nodes->Add(tempVar);
}
while (nodes->Count > 1)
{
List<Node^> ^orderedNodes = nodes->OrderBy(AnonymousMethod1)->ToList<Node^>();
if (orderedNodes->Count >= 2)
{
// Take first two items
List<Node^> ^taken = orderedNodes->Take(2)->ToList<Node^>();
// Create a parent node by combining the frequencies
Node ^parent = gcnew Node();
parent->Symbol = '*';
parent->Frequency = taken[0]->Frequency + taken[1]->Frequency;
parent->Left = taken[0];
parent->Right = taken[1];
nodes->Remove(taken[0]);
nodes->Remove(taken[1]);
nodes->Add(parent);
}
this->Root = nodes->FirstOrDefault();
}
}
private:
void AnonymousMethod1(Object ^node)
{
node->Frequency;
}
public:
BitArray ^Encode(String ^source)
{
List<bool> ^encodedSource = gcnew List<bool>();
for (int i = 0; i < source->Length; i++)
{
List<bool> ^encodedSymbol = this->Root->Traverse(source[i], gcnew List<bool>());
encodedSource->AddRange(encodedSymbol);
}
BitArray ^bits = gcnew BitArray(encodedSource->ToArray());
return bits;
}
String ^Decode(BitArray ^bits)
{
Node ^current = this->Root;
String ^decoded = "";
for each (bool bit in bits)
{
if (bit)
{
if (current->Right != nullptr)
{
current = current->Right;
}
}
else
{
if (current->Left != nullptr)
{
current = current->Left;
}
}
if (IsLeaf(current))
{
decoded += current->Symbol;
current = this->Root;
}
}
return decoded;
}
bool IsLeaf(Node ^node)
{
return (node->Left == nullptr && node->Right == nullptr);
}
}; |
|
Но появляется ошибка в OrderBy, помогите пожалуйста правильно перевести код..