Advertisement
Alan468

Huffman

Mar 4th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.39 KB | None | 0 0
  1. using System;
  2.  
  3. namespace AIKD_01
  4. {
  5.     class Program
  6.     {
  7.         static void Main()
  8.         {
  9.             var huffman = new Huffman("02.txt");
  10.             huffman.Run();
  11.            
  12.             huffman.PrintPretty();
  13.             Console.ReadKey();
  14.         }
  15.     }
  16. }
  17.  
  18. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. namespace AIKD_01
  20. {
  21.     internal class Node
  22.     {
  23.         public char? Char { get; set; }
  24.         public Node Left { get; set; }
  25.         public Node Right { get; set; }
  26.         public string Code { get; set; }
  27.         public string Dir { get; set; }
  28.  
  29.         private int _Count;
  30.         public int Count
  31.         {
  32.             get
  33.             {
  34.                 if (Left != null || Right != null)
  35.                 {
  36.  
  37.                     _Count = 0;
  38.                     if (Left != null)
  39.                         _Count += Left.Count;
  40.                    
  41.                     if (Right != null)
  42.                         _Count += Right.Count;
  43.                 }
  44.                 return _Count;
  45.             }
  46.         }
  47.  
  48.         public Node(char? newChar)
  49.         {
  50.             Code = "";
  51.             Char = newChar;
  52.             _Count = 1;
  53.         }
  54.  
  55.         public void CountAdd()
  56.         {
  57.             _Count++;
  58.         }
  59.     }
  60. }
  61.  
  62. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. using System;
  64. using System.Collections.Generic;
  65. using System.IO;
  66. using System.Linq;
  67. using System.Text.RegularExpressions;
  68.  
  69. namespace AIKD_01
  70. {
  71.     internal class Huffman
  72.     {
  73.         private string FileName, FileText;
  74.         private List<Node> AllNodes;
  75.         private List<Node> CodedList;
  76.         private List<Node> Tree;
  77.  
  78.         public Huffman(string fileName)
  79.         {
  80.             AllNodes = new List<Node>();
  81.             Tree = new List<Node>();
  82.             CodedList = new List<Node>();
  83.             FileName = fileName;
  84.         }
  85.  
  86.         public void Run()
  87.         {
  88.             if (LoadFile())
  89.             {
  90.                 GenerateNodes();
  91.                 Tree = AllNodes;
  92.                 GenerateTree();
  93.                 GenerateCode();
  94.             }
  95.  
  96.             foreach (var letter in FileText)
  97.             {
  98.                 Console.Write(Convert.ToString(letter, 2) + " ");
  99.             }
  100.  
  101.             Console.WriteLine("\n");
  102.  
  103.             foreach (var letter in FileText)
  104.             {
  105.                 Console.Write(CodedList.FirstOrDefault(a=>a.Char == letter).Code + " ");
  106.             }
  107.  
  108.             Console.WriteLine("\n\n");
  109.  
  110.         }
  111.  
  112.         private void GenerateCode(Node node = null, string code = "")
  113.         {
  114.             if (node == null)
  115.                 node = Tree.First();
  116.  
  117.             if (node.Char != '+')
  118.             {
  119.                 node.Code = code;
  120.                 CodedList.Add(node);
  121.             }
  122.  
  123.             if (node.Left != null)
  124.                 GenerateCode(node.Left, code + "0");
  125.             if (node.Right != null)
  126.                 GenerateCode(node.Right, code + "1");
  127.         }
  128.  
  129.         private void GenerateTree()
  130.         {
  131.             while (Tree.Count() != 1)
  132.             {
  133.                 Tree = Tree.OrderBy(t => t.Count).ToList();
  134.  
  135.                 Tree[0].Dir = "LEWO";
  136.                 Tree[1].Dir = "PRAWO";
  137.  
  138.                 var newNode = new Node(null)
  139.                 {
  140.                     Left = Tree[0],
  141.                     Right = Tree[1]
  142.                 };
  143.                 Tree.Add(newNode);
  144.  
  145.                 Tree.RemoveAt(0);
  146.                 Tree.RemoveAt(0);
  147.             }
  148.         }
  149.  
  150.         private void GenerateNodes()
  151.         {
  152.             foreach (var Char in FileText)
  153.             {
  154.                 if (AllNodes.All(c => c.Char != Char))
  155.                     AllNodes.Add(new Node(Char));
  156.                 else
  157.                     AllNodes.First(a => a.Char == Char).CountAdd();
  158.             }
  159.         }
  160.  
  161.         private bool LoadFile()
  162.         {
  163.             var textLetters = "";
  164.             try
  165.             {
  166.                 using (var sr = new StreamReader(FileName))
  167.                 {
  168.                     string line;
  169.                     while ((line = sr.ReadLine()) != null)
  170.                     {
  171.                         textLetters += line.ToUpper();
  172.                     }
  173.                 }
  174.             }
  175.             catch (Exception e)
  176.             {
  177.                 Console.WriteLine($"Nie znaleziono pliku ({e.Message})");
  178.                 return false;
  179.             }
  180.             //var pattern = new Regex("[^A-Za-z]|[ ]");
  181.             //textLetters = pattern.Replace(textLetters, "");
  182.  
  183.             FileText = textLetters;
  184.             return true;
  185.         }
  186.  
  187.         public void PrintPretty(int layer = 0, Node node = null)
  188.         {
  189.             if (node == null && layer == 0)
  190.                 node = Tree.First();
  191.  
  192.             for (var i = 0; i < layer; i++)
  193.                 Console.Write(" ");
  194.  
  195.             if (node.Char != null)
  196.                 Console.WriteLine($"|-'{node.Char}':{node.Count} ({node.Code} : {node.Dir})");
  197.             else
  198.                 Console.WriteLine($"|- {node.Count} : {node.Dir}");
  199.  
  200.             if (node.Left != null)
  201.                 PrintPretty(layer + 2, node.Left);
  202.  
  203.             if (node.Right != null)
  204.                 PrintPretty(layer + 2, node.Right);
  205.         }
  206.     }
  207. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement