• huffman编码 c#实现


      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Text;
      7 using System.Windows.Forms;
      8 using System.Collections.Specialized;
      9 namespace HuffmanCode
     10 {
     11     public partial class Form1 : Form
     12     {
     13         class Node                                 //霍夫曼樹節點結構
     14         {
     15             public char code;
     16             public uint prioirry;                           //保存權值
     17             public Node lchild;                           //左孩子指針
     18             public Node rchild;                           //右孩子指針
     19         }
     20         public Form1()
     21         {
     22             InitializeComponent();
     23 
     24         }
     25 
     26         private Dictionary<char, string> dictcode = new Dictionary<char, string>();
     27         private Node huffTree;
     28 
     29         private int comparisonNode(Node n1, Node n2)
     30         {
     31             return (int)(n1.prioirry - n2.prioirry);
     32         }
     33 
     34         private string encode(string str)
     35         {
     36             dictcode.Clear();
     37             huffTree = null;
     38             if (string.IsNullOrEmpty(str))
     39             {
     40                 return "";
     41             }
     42             Dictionary<char, uint> priorityQueue = new Dictionary<char, uint>();
     43 
     44             for (int i = 0; i < str.Length; i++)
     45             {
     46                 if (priorityQueue.ContainsKey(str[i]))
     47                 {
     48                     priorityQueue[str[i]]++;
     49                 }
     50                 else
     51                 {
     52                     priorityQueue.Add(str[i], 1);
     53                 }
     54             }
     55             List<Node> listpc = new List<Node>();
     56             foreach (var item in priorityQueue)
     57             {
     58                 listpc.Add(new Node() { prioirry = item.Value, lchild = null, rchild = null, code = item.Key });
     59             }
     60 
     61             listpc.Sort(comparisonNode);
     62 
     63             while (listpc.Count > 1)
     64             {
     65                 Node n = new Node();
     66                 n.prioirry = listpc[0].prioirry + listpc[1].prioirry;
     67                 n.lchild = listpc[0];
     68                 n.rchild = listpc[1];
     69                 listpc.RemoveAt(0);
     70                 listpc.RemoveAt(0);
     71                 int index = -1;
     72                 for (int i = 0; i < listpc.Count; i++)
     73                 {
     74                     if (n.prioirry <= listpc[i].prioirry)
     75                     {
     76                         index = i;
     77                         break;
     78                     }
     79                 }
     80                 if (index == -1) { index = listpc.Count; }
     81                 listpc.Insert(index, n);
     82             }
     83             string encodestr = "";
     84             viewTree(listpc[0], "");
     85             huffTree = listpc[0];
     86             for (int i = 0; i < str.Length; i++)
     87             {
     88                 encodestr += dictcode[str[i]];
     89             }
     90             return encodestr;
     91         }
     92 
     93 
     94         private void viewTree(Node n, string v)
     95         {
     96             if (n.code != '\0')
     97             {
     98                 dictcode.Add(n.code, v);
     99             }
    100             else
    101             {
    102                 if (n.lchild != null)
    103                 {
    104                     string vl = v + "0";
    105                     viewTree(n.lchild, vl);
    106                 }
    107                 if (n.rchild != null)
    108                 {
    109                     string vr = v + "1";
    110                     viewTree(n.rchild, vr);
    111                 }
    112             }
    113         }
    114 
    115         private string decode(string str)
    116         {
    117             Node root = huffTree;
    118             string result = "";
    119             for (int i = 0; i < str.Length; i++)
    120             {
    121                 if (root.code != '\0')
    122                 {
    123                     result += root.code.ToString();
    124                     root = huffTree;
    125                 }
    126 
    127                 if (str[i] == '0')
    128                 {
    129                     root = root.lchild;
    130                 }
    131                 else
    132                 {
    133                     root = root.rchild;
    134                 }
    135             }
    136             if (root.code != '\0')
    137             {
    138                 result += root.code.ToString();
    139             }
    140             return result;
    141         }
    142 
    143         private void button1_Click(object sender, EventArgs e)
    144         {
    145             textBox2.Text = encode(textBox1.Text);
    146         }
    147 
    148         private void button2_Click(object sender, EventArgs e)
    149         {
    150             textBox3.Text = decode(textBox2.Text);
    151         }
    152     }
    153 }
  • 相关阅读:
    mysql语句-DDL语句
    Web框架本质
    HTTP协议那些事儿(Web开发补充知识点)
    利用random模块生成验证码
    前端小练习
    常用模块collections
    强大的图片展示插件,JQuery图片预览展示插件
    笔记本电脑清除BIOS密码
    js中的new Option默认选中
    使用PHPMailer发送邮件
  • 原文地址:https://www.cnblogs.com/yczz/p/2517390.html
Copyright © 2020-2023  润新知