• C#,哈夫曼编码(Huffman Code)压缩(Compress )与解压缩(Decompress)算法与源代码


     David A. Huffman

    1 哈夫曼编码简史(Huffman code)

    1951年,哈夫曼和他在MIT信息论的同学需要选择是完成学期报告还是期末考试。导师Robert M. Fano给他们的学期报告的题目是,寻找最有效的二进制编码。由于无法证明哪个已有编码是最有效的,哈夫曼放弃对已有编码的研究,转向新的探索,最终发现了基于有序频率二叉树编码的想法,并很快证明了这个方法是最有效的。由于这个算法,学生终于青出于蓝,超过了他那曾经和信息论创立者香农共同研究过类似编码的导师。哈夫曼使用自底向上的方法构建二叉树,避免了次优算法Shannon-Fano编码的最大弊端──自顶向下构建树。
    1952年,David A. Huffman在麻省理工攻读博士时发表了《一种构建极小多余编码的方法》,一文,它一般就叫做Huffman编码A Method for the Construction of Minimum-Redundancy Codesicon-default.png?t=N7T8https://www.ias.ac.in/article/fulltext/reso/011/02/0091-0099
    Huffman在1952年根据香农(Shannon)在1948年和范若(Fano)在1949年阐述的这种编码思想提出了一种不定长编码的方法,也称霍夫曼(Huffman)编码。霍夫曼编码的基本方法是先对图像数据扫描一遍,计算出各种像素出现的概率,按概率的大小指定不同长度的唯一码字,由此得到一张该图像的霍夫曼码表。编码后的图像数据记录的是每个像素的码字,而码字与实际像素值的对应关系记录在码表中。

    2 赫夫曼编码

    赫夫曼编码是可变字长编码(VLC)的一种。 Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长 度最短的码字,有时称之为最佳编码,一般就称Huffman编码。下面引证一个定理,该定理保证了按字符出现概率分配码长,可使平均码长最短。

    3 源程序

    using System;
    using System.IO;
    using System.Text;
    using System.Linq;
    using System.Collections;
    using System.Collections.Generic;

    namespace Legalsoft.Truffer.Algorithm
    {
        ///


        /// 哈夫曼编码的压缩与解压缩
        ///

        public class HuffmanCompressor
        {
            private HuffmanNode oRootHuffmanNode { get; set; } = null;
            private List oValueHuffmanNodes { get; set; } = null;

            private List BuildBinaryTree(string Value)
            {
                List oHuffmanNodes = GetInitialNodeList();

                Value.ToList().ForEach(m => oHuffmanNodes[m].Weight++);

                oHuffmanNodes = oHuffmanNodes
                    .Where(m => (m.Weight > 0))
                    .OrderBy(m => (m.Weight))
                    .ThenBy(m => (m.Value))
                    .ToList();

                oHuffmanNodes = UpdateNodeParents(oHuffmanNodes);

                oRootHuffmanNode = oHuffmanNodes[0];
                oHuffmanNodes.Clear();

                SortNodes(oRootHuffmanNode, oHuffmanNodes);

                return oHuffmanNodes;
            }

            public void Compress(string FileName)
            {
                FileInfo oFileInfo = new FileInfo(FileName);

                if (oFileInfo.Exists == true)
                {
                    string sFileContents = "";

                    using (StreamReader oStreamReader = new StreamReader(File.OpenRead(FileName)))
                    {
                        sFileContents = oStreamReader.ReadToEnd();
                    }

                    List oHuffmanNodes = BuildBinaryTree(sFileContents);

                    oValueHuffmanNodes = oHuffmanNodes
                        .Where(m => (m.Value.HasValue == true))
                        .OrderBy(m => (m.BinaryWord))
                        .ToList();

                    Dictionary oCharToBinaryWordDictionary = new Dictionary();
                    foreach (HuffmanNode oHuffmanNode in oValueHuffmanNodes)
                    {
                        oCharToBinaryWordDictionary.Add(oHuffmanNode.Value.Value, oHuffmanNode.BinaryWord);
                    }

                    StringBuilder oStringBuilder = new StringBuilder();
                    List oByteList = new List();
                    for (int i = 0; i < sFileContents.Length; i++)
                    {
                        string sWord = "";

                        oStringBuilder.Append(oCharToBinaryWordDictionary[sFileContents[i]]);

                        while (oStringBuilder.Length >= 8)
                        {
                            sWord = oStringBuilder.ToString().Substring(0, 8);

                            oStringBuilder.Remove(0, sWord.Length);
                        }

                        if (String.IsNullOrEmpty(sWord) == false)
                        {
                            oByteList.Add(Convert.ToByte(sWord, 2));
                        }
                    }

                    if (oStringBuilder.Length > 0)
                    {
                        string sWord = oStringBuilder.ToString();

                        if (String.IsNullOrEmpty(sWord) == false)
                        {
                            oByteList.Add(Convert.ToByte(sWord, 2));
                        }
                    }

                    string sCompressedFileName = Path.Combine(oFileInfo.Directory.FullName, String.Format("{0}.compressed", oFileInfo.Name.Replace(oFileInfo.Extension, "")));
                    if (File.Exists(sCompressedFileName) == true)
                    {
                        File.Delete(sCompressedFileName);
                    }

                    using (FileStream oFileStream = File.OpenWrite(sCompressedFileName))
                    {
                        oFileStream.Write(oByteList.ToArray(), 0, oByteList.Count);
                    }
                }
            }

            public void Decompress(string FileName)
            {
                FileInfo oFileInfo = new FileInfo(FileName);

                if (oFileInfo.Exists == true)
                {
                    string sCompressedFileName = String.Format("{0}.compressed", oFileInfo.FullName.Replace(oFileInfo.Extension, ""));

                    byte[] oBuffer = null;
                    using (FileStream oFileStream = File.OpenRead(sCompressedFileName))
                    {
                        oBuffer = new byte[oFileStream.Length];
                        oFileStream.Read(oBuffer, 0, oBuffer.Length);
                    }

                    HuffmanNode oZeroHuffmanNode = oRootHuffmanNode;
                    while (oZeroHuffmanNode.Left != null)
                    {
                        oZeroHuffmanNode = oZeroHuffmanNode.Left;
                    }

                    HuffmanNode oCurrentHuffmanNode = null;
                    StringBuilder oStringBuilder = new StringBuilder();

                    for (int i = 0; i < oBuffer.Length; i++)
                    {
                        string sBinaryWord = "";
                        byte oByte = oBuffer[i];

                        if (oByte == 0)
                        {
                            sBinaryWord = oZeroHuffmanNode.BinaryWord;
                        }
                        else
                        {
                            sBinaryWord = Convert.ToString(oByte, 2);
                        }

                        if ((sBinaryWord.Length < 8) && (i < (oBuffer.Length - 1)))
                        {
                            StringBuilder oBinaryStringBuilder = new StringBuilder(sBinaryWord);
                            while (oBinaryStringBuilder.Length < 8)
                            {
                                oBinaryStringBuilder.Insert(0, "0");
                            }

                            sBinaryWord = oBinaryStringBuilder.ToString();
                        }

                        for (int j = 0; j < sBinaryWord.Length; j++)
                        {
                            char cValue = sBinaryWord[j];

                            if (oCurrentHuffmanNode == null)
                            {
                                oCurrentHuffmanNode = oRootHuffmanNode;
                            }

                            if (cValue == '0')
                            {
                                oCurrentHuffmanNode = oCurrentHuffmanNode.Left;
                            }
                            else
                            {
                                oCurrentHuffmanNode = oCurrentHuffmanNode.Right;
                            }

                            if ((oCurrentHuffmanNode.Left == null) && (oCurrentHuffmanNode.Right == null))
                            {
                                oStringBuilder.Append(oCurrentHuffmanNode.Value.Value);
                                oCurrentHuffmanNode = null;
                            }
                        }
                    }

                    string sUncompressedFileName = Path.Combine(oFileInfo.Directory.FullName, String.Format("{0}.uncompressed", oFileInfo.Name.Replace(oFileInfo.Extension, "")));

                    if (File.Exists(sUncompressedFileName) == true)
                    {
                        File.Delete(sUncompressedFileName);
                    }

                    using (StreamWriter oStreamWriter = new StreamWriter(File.OpenWrite(sUncompressedFileName)))
                    {
                        oStreamWriter.Write(oStringBuilder.ToString());
                    }
                }
            }

            private static List GetInitialNodeList()
            {
                List oGetInitialNodeList = new List();

                for (int i = Char.MinValue; i < Char.MaxValue; i++)
                {
                    oGetInitialNodeList.Add(new HuffmanNode((char)(i)));
                }

                return oGetInitialNodeList;
            }

            private static void SortNodes(HuffmanNode Node, List Nodes)
            {
                if (Nodes.Contains(Node) == false)
                {
                    Nodes.Add(Node);
                }

                if (Node.Left != null)
                {
                    SortNodes(Node.Left, Nodes);
                }

                if (Node.Right != null)
                {
                    SortNodes(Node.Right, Nodes);
                }
            }

            private static List UpdateNodeParents(List Nodes)
            {
                while (Nodes.Count > 1)
                {
                    int iOperations = (Nodes.Count / 2);
                    for (int iOperation = 0, i = 0, j = 1; iOperation < iOperations; iOperation++, i += 2, j += 2)
                    {
                        if (j < Nodes.Count)
                        {
                            HuffmanNode oParentHuffmanNode = new HuffmanNode(Nodes[i], Nodes[j]);
                            Nodes.Add(oParentHuffmanNode);

                            Nodes[i] = null;
                            Nodes[j] = null;
                        }
                    }

                    Nodes = Nodes
                        .Where(m => (m != null))
                        .OrderBy(m => (m.Weight))
                        .ToList();
                }

                return Nodes;
            }
        }

        public class HuffmanNode
        {
            private string sBinaryWord { get; set; } = "";
            private bool bIsLeftNode { get; set; } = false;
            private bool bIsRightNode { get; set; } = false;
            private HuffmanNode oLeft { get; set; } = null;
            private HuffmanNode oParent { get; set; } = null;
            private HuffmanNode oRight { get; set; } = null;
            private char? cValue { get; set; } = ' ';
            private int iWeight { get; set; } = 0;

            public HuffmanNode()
            {
            }

            public HuffmanNode(char Value)
            {
                cValue = Value;
            }

            public HuffmanNode(HuffmanNode Left, HuffmanNode Right)
            {
                oLeft = Left;
                oLeft.oParent = this;
                oLeft.bIsLeftNode = true;

                oRight = Right;
                oRight.oParent = this;
                oRight.bIsRightNode = true;

                iWeight = (oLeft.Weight + oRight.Weight);
            }

            public string BinaryWord
            {
                get
                {
                    string sReturnValue = "";

                    if (String.IsNullOrEmpty(sBinaryWord) == true)
                    {
                        StringBuilder oStringBuilder = new StringBuilder();

                        HuffmanNode oHuffmanNode = this;

                        while (oHuffmanNode != null)
                        {
                            if (oHuffmanNode.bIsLeftNode == true)
                            {
                                oStringBuilder.Insert(0, "0");
                            }

                            if (oHuffmanNode.bIsRightNode == true)
                            {
                                oStringBuilder.Insert(0, "1");
                            }

                            oHuffmanNode = oHuffmanNode.oParent;
                        }

                        sReturnValue = oStringBuilder.ToString();
                        sBinaryWord = sReturnValue;
                    }
                    else
                    {
                        sReturnValue = sBinaryWord;
                    }

                    return sReturnValue;
                }
            }

            public HuffmanNode Left
            {
                get
                {
                    return oLeft;
                }
            }

            public HuffmanNode Parent
            {
                get
                {
                    return oParent;
                }
            }

            public HuffmanNode Right
            {
                get
                {
                    return oRight;
                }
            }

            public char? Value
            {
                get
                {
                    return cValue;
                }
            }

            public int Weight
            {
                get
                {
                    return iWeight;
                }
                set
                {
                    iWeight = value;
                }
            }

            public static int BinaryStringToInt32(string Value)
            {
                int iBinaryStringToInt32 = 0;

                for (int i = (Value.Length - 1), j = 0; i >= 0; i--, j++)
                {
                    iBinaryStringToInt32 += ((Value[j] == '0' ? 0 : 1) * (int)(Math.Pow(2, i)));
                }

                return iBinaryStringToInt32;
            }

            public override string ToString()
            {
                StringBuilder sb = new StringBuilder();

                if (cValue.HasValue == true)
                {
                    sb.AppendFormat("'{0}' ({1}) - {2} ({3})", cValue.Value, iWeight, BinaryWord, BinaryStringToInt32(BinaryWord));
                }
                else
                {
                    if ((oLeft != null) && (oRight != null))
                    {
                        if ((oLeft.Value.HasValue == true) && (oRight.Value.HasValue == true))
                        {
                            sb.AppendFormat("{0} + {1} ({2})", oLeft.Value, oRight.Value, iWeight);
                        }
                        else
                        {
                            sb.AppendFormat("{0}, {1} - ({2})", oLeft, oRight, iWeight);
                        }
                    }
                    else
                    {
                        sb.Append(iWeight);
                    }
                }

                return sb.ToString();
            }
        }
    }
     

    4 源代码

    1. using System;
    2. using System.IO;
    3. using System.Text;
    4. using System.Linq;
    5. using System.Collections;
    6. using System.Collections.Generic;
    7. namespace Legalsoft.Truffer.Algorithm
    8. {
    9.     ///
    10.     /// 哈夫曼编码的压缩与解压缩
    11.     ///
    12.     public class HuffmanCompressor
    13.     {
    14.         private HuffmanNode oRootHuffmanNode { get; set; } = null;
    15.         private List oValueHuffmanNodes { get; set; } = null;
    16.         private List BuildBinaryTree(string Value)
    17.         {
    18.             List oHuffmanNodes = GetInitialNodeList();
    19.             Value.ToList().ForEach(m => oHuffmanNodes[m].Weight++);
    20.             oHuffmanNodes = oHuffmanNodes
    21.                 .Where(m => (m.Weight > 0))
    22.                 .OrderBy(m => (m.Weight))
    23.                 .ThenBy(m => (m.Value))
    24.                 .ToList();
    25.             oHuffmanNodes = UpdateNodeParents(oHuffmanNodes);
    26.             oRootHuffmanNode = oHuffmanNodes[0];
    27.             oHuffmanNodes.Clear();
    28.             SortNodes(oRootHuffmanNode, oHuffmanNodes);
    29.             return oHuffmanNodes;
    30.         }
    31.         public void Compress(string FileName)
    32.         {
    33.             FileInfo oFileInfo = new FileInfo(FileName);
    34.             if (oFileInfo.Exists == true)
    35.             {
    36.                 string sFileContents = "";
    37.                 using (StreamReader oStreamReader = new StreamReader(File.OpenRead(FileName)))
    38.                 {
    39.                     sFileContents = oStreamReader.ReadToEnd();
    40.                 }
    41.                 List oHuffmanNodes = BuildBinaryTree(sFileContents);
    42.                 oValueHuffmanNodes = oHuffmanNodes
    43.                     .Where(m => (m.Value.HasValue == true))
    44.                     .OrderBy(m => (m.BinaryWord))
    45.                     .ToList();
    46.                 Dictionary<char, string> oCharToBinaryWordDictionary = new Dictionary<char, string>();
    47.                 foreach (HuffmanNode oHuffmanNode in oValueHuffmanNodes)
    48.                 {
    49.                     oCharToBinaryWordDictionary.Add(oHuffmanNode.Value.Value, oHuffmanNode.BinaryWord);
    50.                 }
    51.                 StringBuilder oStringBuilder = new StringBuilder();
    52.                 List<byte> oByteList = new List<byte>();
    53.                 for (int i = 0; i < sFileContents.Length; i++)
    54.                 {
    55.                     string sWord = "";
    56.                     oStringBuilder.Append(oCharToBinaryWordDictionary[sFileContents[i]]);
    57.                     while (oStringBuilder.Length >= 8)
    58.                     {
    59.                         sWord = oStringBuilder.ToString().Substring(0, 8);
    60.                         oStringBuilder.Remove(0, sWord.Length);
    61.                     }
    62.                     if (String.IsNullOrEmpty(sWord) == false)
    63.                     {
    64.                         oByteList.Add(Convert.ToByte(sWord, 2));
    65.                     }
    66.                 }
    67.                 if (oStringBuilder.Length > 0)
    68.                 {
    69.                     string sWord = oStringBuilder.ToString();
    70.                     if (String.IsNullOrEmpty(sWord) == false)
    71.                     {
    72.                         oByteList.Add(Convert.ToByte(sWord, 2));
    73.                     }
    74.                 }
    75.                 string sCompressedFileName = Path.Combine(oFileInfo.Directory.FullName, String.Format("{0}.compressed", oFileInfo.Name.Replace(oFileInfo.Extension, "")));
    76.                 if (File.Exists(sCompressedFileName) == true)
    77.                 {
    78.                     File.Delete(sCompressedFileName);
    79.                 }
    80.                 using (FileStream oFileStream = File.OpenWrite(sCompressedFileName))
    81.                 {
    82.                     oFileStream.Write(oByteList.ToArray(), 0, oByteList.Count);
    83.                 }
    84.             }
    85.         }
    86.         public void Decompress(string FileName)
    87.         {
    88.             FileInfo oFileInfo = new FileInfo(FileName);
    89.             if (oFileInfo.Exists == true)
    90.             {
    91.                 string sCompressedFileName = String.Format("{0}.compressed", oFileInfo.FullName.Replace(oFileInfo.Extension, ""));
    92.                 byte[] oBuffer = null;
    93.                 using (FileStream oFileStream = File.OpenRead(sCompressedFileName))
    94.                 {
    95.                     oBuffer = new byte[oFileStream.Length];
    96.                     oFileStream.Read(oBuffer, 0, oBuffer.Length);
    97.                 }
    98.                 HuffmanNode oZeroHuffmanNode = oRootHuffmanNode;
    99.                 while (oZeroHuffmanNode.Left != null)
    100.                 {
    101.                     oZeroHuffmanNode = oZeroHuffmanNode.Left;
    102.                 }
    103.                 HuffmanNode oCurrentHuffmanNode = null;
    104.                 StringBuilder oStringBuilder = new StringBuilder();
    105.                 for (int i = 0; i < oBuffer.Length; i++)
    106.                 {
    107.                     string sBinaryWord = "";
    108.                     byte oByte = oBuffer[i];
    109.                     if (oByte == 0)
    110.                     {
    111.                         sBinaryWord = oZeroHuffmanNode.BinaryWord;
    112.                     }
    113.                     else
    114.                     {
    115.                         sBinaryWord = Convert.ToString(oByte, 2);
    116.                     }
    117.                     if ((sBinaryWord.Length < 8) && (i < (oBuffer.Length - 1)))
    118.                     {
    119.                         StringBuilder oBinaryStringBuilder = new StringBuilder(sBinaryWord);
    120.                         while (oBinaryStringBuilder.Length < 8)
    121.                         {
    122.                             oBinaryStringBuilder.Insert(0, "0");
    123.                         }
    124.                         sBinaryWord = oBinaryStringBuilder.ToString();
    125.                     }
    126.                     for (int j = 0; j < sBinaryWord.Length; j++)
    127.                     {
    128.                         char cValue = sBinaryWord[j];
    129.                         if (oCurrentHuffmanNode == null)
    130.                         {
    131.                             oCurrentHuffmanNode = oRootHuffmanNode;
    132.                         }
    133.                         if (cValue == '0')
    134.                         {
    135.                             oCurrentHuffmanNode = oCurrentHuffmanNode.Left;
    136.                         }
    137.                         else
    138.                         {
    139.                             oCurrentHuffmanNode = oCurrentHuffmanNode.Right;
    140.                         }
    141.                         if ((oCurrentHuffmanNode.Left == null) && (oCurrentHuffmanNode.Right == null))
    142.                         {
    143.                             oStringBuilder.Append(oCurrentHuffmanNode.Value.Value);
    144.                             oCurrentHuffmanNode = null;
    145.                         }
    146.                     }
    147.                 }
    148.                 string sUncompressedFileName = Path.Combine(oFileInfo.Directory.FullName, String.Format("{0}.uncompressed", oFileInfo.Name.Replace(oFileInfo.Extension, "")));
    149.                 if (File.Exists(sUncompressedFileName) == true)
    150.                 {
    151.                     File.Delete(sUncompressedFileName);
    152.                 }
    153.                 using (StreamWriter oStreamWriter = new StreamWriter(File.OpenWrite(sUncompressedFileName)))
    154.                 {
    155.                     oStreamWriter.Write(oStringBuilder.ToString());
    156.                 }
    157.             }
    158.         }
    159.         private static List GetInitialNodeList()
    160.         {
    161.             List oGetInitialNodeList = new List();
    162.             for (int i = Char.MinValue; i < Char.MaxValue; i++)
    163.             {
    164.                 oGetInitialNodeList.Add(new HuffmanNode((char)(i)));
    165.             }
    166.             return oGetInitialNodeList;
    167.         }
    168.         private static void SortNodes(HuffmanNode Node, List Nodes)
    169.         {
    170.             if (Nodes.Contains(Node) == false)
    171.             {
    172.                 Nodes.Add(Node);
    173.             }
    174.             if (Node.Left != null)
    175.             {
    176.                 SortNodes(Node.Left, Nodes);
    177.             }
    178.             if (Node.Right != null)
    179.             {
    180.                 SortNodes(Node.Right, Nodes);
    181.             }
    182.         }
    183.         private static List UpdateNodeParents(List Nodes)
    184.         {
    185.             while (Nodes.Count > 1)
    186.             {
    187.                 int iOperations = (Nodes.Count / 2);
    188.                 for (int iOperation = 0, i = 0, j = 1; iOperation < iOperations; iOperation++, i += 2, j += 2)
    189.                 {
    190.                     if (j < Nodes.Count)
    191.                     {
    192.                         HuffmanNode oParentHuffmanNode = new HuffmanNode(Nodes[i], Nodes[j]);
    193.                         Nodes.Add(oParentHuffmanNode);
    194.                         Nodes[i] = null;
    195.                         Nodes[j] = null;
    196.                     }
    197.                 }
    198.                 Nodes = Nodes
    199.                     .Where(m => (m != null))
    200.                     .OrderBy(m => (m.Weight))
    201.                     .ToList();
    202.             }
    203.             return Nodes;
    204.         }
    205.     }
    206.     public class HuffmanNode
    207.     {
    208.         private string sBinaryWord { get; set; } = "";
    209.         private bool bIsLeftNode { get; set; } = false;
    210.         private bool bIsRightNode { get; set; } = false;
    211.         private HuffmanNode oLeft { get; set; } = null;
    212.         private HuffmanNode oParent { get; set; } = null;
    213.         private HuffmanNode oRight { get; set; } = null;
    214.         private char? cValue { get; set; } = ' ';
    215.         private int iWeight { get; set; } = 0;
    216.         public HuffmanNode()
    217.         {
    218.         }
    219.         public HuffmanNode(char Value)
    220.         {
    221.             cValue = Value;
    222.         }
    223.         public HuffmanNode(HuffmanNode Left, HuffmanNode Right)
    224.         {
    225.             oLeft = Left;
    226.             oLeft.oParent = this;
    227.             oLeft.bIsLeftNode = true;
    228.             oRight = Right;
    229.             oRight.oParent = this;
    230.             oRight.bIsRightNode = true;
    231.             iWeight = (oLeft.Weight + oRight.Weight);
    232.         }
    233.         public string BinaryWord
    234.         {
    235.             get
    236.             {
    237.                 string sReturnValue = "";
    238.                 if (String.IsNullOrEmpty(sBinaryWord) == true)
    239.                 {
    240.                     StringBuilder oStringBuilder = new StringBuilder();
    241.                     HuffmanNode oHuffmanNode = this;
    242.                     while (oHuffmanNode != null)
    243.                     {
    244.                         if (oHuffmanNode.bIsLeftNode == true)
    245.                         {
    246.                             oStringBuilder.Insert(0, "0");
    247.                         }
    248.                         if (oHuffmanNode.bIsRightNode == true)
    249.                         {
    250.                             oStringBuilder.Insert(0, "1");
    251.                         }
    252.                         oHuffmanNode = oHuffmanNode.oParent;
    253.                     }
    254.                     sReturnValue = oStringBuilder.ToString();
    255.                     sBinaryWord = sReturnValue;
    256.                 }
    257.                 else
    258.                 {
    259.                     sReturnValue = sBinaryWord;
    260.                 }
    261.                 return sReturnValue;
    262.             }
    263.         }
    264.         public HuffmanNode Left
    265.         {
    266.             get
    267.             {
    268.                 return oLeft;
    269.             }
    270.         }
    271.         public HuffmanNode Parent
    272.         {
    273.             get
    274.             {
    275.                 return oParent;
    276.             }
    277.         }
    278.         public HuffmanNode Right
    279.         {
    280.             get
    281.             {
    282.                 return oRight;
    283.             }
    284.         }
    285.         public char? Value
    286.         {
    287.             get
    288.             {
    289.                 return cValue;
    290.             }
    291.         }
    292.         public int Weight
    293.         {
    294.             get
    295.             {
    296.                 return iWeight;
    297.             }
    298.             set
    299.             {
    300.                 iWeight = value;
    301.             }
    302.         }
    303.         public static int BinaryStringToInt32(string Value)
    304.         {
    305.             int iBinaryStringToInt32 = 0;
    306.             for (int i = (Value.Length - 1), j = 0; i >= 0; i--, j++)
    307.             {
    308.                 iBinaryStringToInt32 += ((Value[j] == '0' ? 0 : 1) * (int)(Math.Pow(2, i)));
    309.             }
    310.             return iBinaryStringToInt32;
    311.         }
    312.         public override string ToString()
    313.         {
    314.             StringBuilder sb = new StringBuilder();
    315.             if (cValue.HasValue == true)
    316.             {
    317.                 sb.AppendFormat("'{0}' ({1}) - {2} ({3})", cValue.Value, iWeight, BinaryWord, BinaryStringToInt32(BinaryWord));
    318.             }
    319.             else
    320.             {
    321.                 if ((oLeft != null) && (oRight != null))
    322.                 {
    323.                     if ((oLeft.Value.HasValue == true) && (oRight.Value.HasValue == true))
    324.                     {
    325.                         sb.AppendFormat("{0} + {1} ({2})", oLeft.Value, oRight.Value, iWeight);
    326.                     }
    327.                     else
    328.                     {
    329.                         sb.AppendFormat("{0}, {1} - ({2})", oLeft, oRight, iWeight);
    330.                     }
    331.                 }
    332.                 else
    333.                 {
    334.                     sb.Append(iWeight);
    335.                 }
    336.             }
    337.             return sb.ToString();
    338.         }
    339.     }
    340. }

  • 相关阅读:
    如何提高爬虫效率
    极简idea下git操作(二)
    Scrapy 2.6.2 代理设置,Proxy-Authorization 安全漏洞修复
    Linux mmap 的作用是什么?
    【金融投资】一文带你了解 加息、降息与利率
    JAVA 开发中常用的工具有哪些?
    Oracle主备切换,ogg恢复方法(集成模式)
    c语言数据结构,你可能还不知道的顺序表
    VuePress@next 使用数学公式插件
    SpringBoot课堂笔记20230913
  • 原文地址:https://blog.csdn.net/beijinghorn/article/details/124789465