Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //код хаффамана класс
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.IO;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading.Tasks;
- namespace Myloyorrrr
- {
- internal class HuffmanTree
- {
- private class Node:IComparable<Node>
- {
- public char symb; //информационное поле
- public int count; //кол-во появлений в строке
- public int height; // высота в дереве
- public Node left; //ссылка на левое поддерево
- public Node right; //ссылка на правое поддерево
- //конструктор вложенного класса, создает узел дерева
- public Node(char x, int y, int z)
- {
- symb = x;
- count = y;
- height = z;
- left = null;
- right = null;
- }
- public Node(char s, int c, int h, Node l, Node r)
- {
- symb = s;
- count = c;
- height = h;
- left = l;
- right = r;
- }
- public int CompareTo(Node node)
- {
- if (this.count == node.count)
- {
- if (this.height == node.height)
- {
- return this.symb.CompareTo(node.symb);
- }
- return this.height.CompareTo(node.height);
- }
- return this.count.CompareTo(node.count);
- }
- }
- Node tree;
- Dictionary<char, string> encodeDict = new Dictionary<char, string>();
- Dictionary<string, char> decodeDict = new Dictionary<string, char>();
- private void Coding(Node node, string code)
- {
- if (node == null)
- {
- return;
- }
- if (node.right == null && node.left == null)
- {
- encodeDict[node.symb] = code;
- }
- //if (node.right != null)
- //{
- // Coding(node.right, code + "1");
- //}
- //if (node.left != null)
- //{
- // Coding(node.left, code + "0");
- //}
- Coding(node.left, code + "0");
- Coding(node.right, code + "1");
- }
- public void Encode(string fileinname, string fileoutname)
- {
- string s = "";
- using (StreamReader f = new StreamReader(fileinname))
- {
- s = f.ReadToEnd();
- }
- Dictionary<char, int> symbols = new Dictionary<char, int>();
- foreach(var elem in s)
- {
- if (!symbols.ContainsKey(elem))
- {
- symbols.Add(elem, 0);
- }
- symbols[elem]++;
- }
- SortedSet<Node> nodes = new SortedSet<Node>();
- foreach(var node in symbols)
- {
- nodes.Add(new Node(node.Key, node.Value, 1));
- }
- while (nodes.Count > 1)
- {
- Node Node1 = nodes.First();
- nodes.Remove(Node1);
- Node Node2 = nodes.First();
- nodes.Remove(Node2);
- Node New_Node = new Node(Node1.symb, Node1.count + Node2.count, Math.Max(Node1.height, Node2.height) + 1, Node1, Node2);
- nodes.Add(New_Node);
- }
- tree = nodes.First();
- Coding(tree, "");
- foreach(var node in encodeDict)
- {
- Console.WriteLine(node.Key + " = " + node.Value);
- }
- int size = 0;
- foreach(var x in s)
- {
- size += encodeDict[x].Length;
- }
- BitArray codes = new BitArray(size);
- int ind = 0;
- foreach(var x in s)
- {
- string code = encodeDict[x];
- for (int i = 0; i < code.Length; i++)
- {
- codes[ind] = (code[i] == '1');
- ind++;
- }
- }
- byte[] bytes = new byte[(size+7)/8];
- codes.CopyTo(bytes, 0);
- using (BinaryWriter f = new BinaryWriter(File.Open(fileoutname, FileMode.Create)))
- {
- f.Write(encodeDict.Count);
- foreach(var node in encodeDict)
- {
- f.Write(node.Key);
- f.Write(node.Value);
- }
- f.Write(size);
- f.Write(bytes);
- }
- }
- public void Decode(string fileinname, string fileoutname)
- {
- int count = 0;
- StringBuilder res = new StringBuilder();
- using (BinaryReader f = new BinaryReader(File.Open(fileinname, FileMode.Open)))
- {
- count = f.ReadInt32();
- for (int i = 0; i < count; i++)
- {
- char symb = f.ReadChar();
- string s = f.ReadString();
- decodeDict[s] = symb;
- }
- int size = f.ReadInt32();
- BitArray bits = new BitArray(size);
- int ind = 0;
- for (int i = 0; i < (size+7)/8; i++)
- {
- byte b = f.ReadByte();
- for (int j = 0; j < 8; j++)
- {
- bits[ind] = ((b >> j) & 1) == 1;
- ind++;
- if (ind >= size)
- {
- break;
- }
- }
- }
- string temp = "";
- for (int i = 0; i < size; i++)
- {
- temp += (bits[i]) ? "1": "0";
- if (decodeDict.ContainsKey(temp))
- {
- res.Append(decodeDict[temp]);
- temp = "";
- }
- }
- }
- using(StreamWriter f = new StreamWriter(fileoutname))
- {
- f.Write(res.ToString());
- }
- }
- }
- }
- //основная прога
- using System;
- using System.IO;
- namespace Myloyorrrr
- {
- internal class Program
- {
- static void Main()
- {
- //Graph G = new Graph("C:/Настя/книит/in.txt");
- //G.Show();
- //Console.WriteLine();
- //
- ////3 задача
- //Console.WriteLine("Введите первую вершину:");
- //int a = int.Parse(Console.ReadLine());
- //Console.WriteLine("Введите вторую вершину:");
- //int b = int.Parse(Console.ReadLine());
- //Console.WriteLine("Введите вершину, через которую нельзя пройти:");
- //int d = int.Parse(Console.ReadLine());
- //Console.WriteLine();
- //G.Myloyo_find(a-1, b-1, d-1);
- //// 1 задача: подсчитать смежные вершины с данной вершиной
- //Console.Write("Введите номер вершины: ");
- //int v = int.Parse(Console.ReadLine());
- //G.Adjacent(v);
- //// 2 задача: определить все пары вершин, для которых существует путь длиной не более L
- //Console.Write("Введите требуемую длину пути: ");
- //int L = int.Parse(Console.ReadLine());
- //G.Floyd_new(L);
- //BinaryTree lipa = new BinaryTree();
- //int n = 0;
- ////Чтение последовательности чисел из файла input.txt и добавление их в дерево
- //using (StreamReader f = new StreamReader("C:/Настя/книит/in.txt"))
- //{
- // string line;
- // while ((line = f.ReadLine()) != null)
- // {
- // string[] text = line.Split(' ');
- // for (int i = 0; i < text.Length; i++)
- // {
- // int num = int.Parse(text[i]);
- // lipa.Add(num);
- // n++;
- // }
- // }
- //}
- //lipa.Preorder();
- ////3 деревья
- //bool IsBalance = lipa.Balance();
- //if (IsBalance)
- //{
- // Console.WriteLine("Дерево является сбалансированным");
- //}
- //else
- //{
- // Console.WriteLine("Дерево не является сбалансированным");
- //}
- //доп задача
- HuffmanTree tree = new HuffmanTree();
- //tree.Encode("C:/Настя/книит/in.txt", "C:/Настя/книит/out.dat");
- tree.Decode("C:/Настя/книит/out.dat", "C:/Настя/книит/out.txt");
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement