csharp高级练习题:压缩:这看起来像霍夫曼压缩!【难度:4级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练

csharp高级练习题:压缩:这看起来像霍夫曼压缩!【难度:4级】:

用于压缩的最常见的算法之一是霍夫曼压缩.

霍夫曼压缩使用频率表,从中建立二叉树.通过再次遍历该二叉树,可以形成二进制代码.众所周知,二进制代码可以很容易地重写为ASCII字符.通过对频率表进行排序来获得压缩,其中频率最高的字符显然远高于频率较低的字符.

有关详细信息,请参阅:https://en.wikipedia.org/wiki/Huffman_coding

如果您选择接受它,您的任务就是编写一个功能齐全的霍夫曼编码/解码程序.这意味着您(可能)需要创建三个类(当然允许其他签名!):

HuffmanFrequencyTable
HuffmanNode
HuffmanTree

已经提供了这些类的基本标识,但为了更好的可读性和执行性,可能会自行更改!

HuffmanFrequencyTable
这个类很简单,它应该包含一个帮助你作为程序员的数据结构,还有一个名为 Accept 的方法,它接受给定的字符串并填充选择的数据结构.当然,您可以添加 ToString()方法来转储频率表.

示例:的
请考虑以下字符串:
“快速褐色位跳过懒惰字节”
应生成以下频率表:

.tg {border-collapse:collapse; border-spacing:0;}
.tg td {font-family:Arial,sans-serif; font-size:14px; padding:10px 5px; border-style:solid; border-width:1px; overflow:hidden; word-break:normal;}
.tg th {font-family:Arial,sans-serif; font-size:14px; font-weight:normal; padding:10px 5px; border-style:solid; border-width:1px; overflow:hidden; word-break :正常;}
.tg .tg-baqh {text-align:center; vertical-align:top}
.tg .tg-yw4l {vertical-align:top}
</样式>

T
     q
     c
     k
     w
     n
     j
     m
     p
     s
     v
     l
     a
     z
     h
     u
    我
     r
     o
     y
     b
     t
     e
    (空白)
  
  
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     1
     2
     2
     2
     2
     2
     2
     3
     3
     4
     8

HuffmanNode
该类也意味着简单,它意味着形成形成霍夫曼二叉树的数据结构.由于这些霍夫曼树由节点组成,所以这个类是后者.每个节点至少应该能够保持一个可空字符,以及它的相应频率.但请记住,此节点也可以充当内部存储节点,当然也可以连接其他节点.

HuffmanTree
这是最后一堂课,也是我们任务的核心.类本身将根据给定输入的生成频率表构建树,我们首先将其视为字符串.
树构建完成后,我们可以使用此树编码和解码给定输入!这些方法的标志:

公共BitArray编码(字符串来源)
此方法将给定字符串编码为BitArray.此处的每个位表示树中的左(0)或右(1)路径.

公共字符串解码(BitArray位)
此方法将给定的BitArray解码回字符串.您不必再次重新创建频率表,我们将使用在编码时创建的旧频率表!

使用先前使用的示例,您的霍夫曼编码器应编码(使用代码页:Encode.ASCII)
“快速褐色位跳过懒惰字节” 到

的 “???} / \ C |???5U UZ> d \ B5” 的
由于这几乎不可读,我们也可能想要考虑以下二进制代码(当然没有空格):
11111010 01111001 01111111 11010110
11000000 00011010 11111100 11101000
10000111 01011111 01110001 01001101
10100011 10100001 00110111 10101010
11001110 01011000 10011110 01010101
10110001 10111110 10101111 11101000
1100

包起来:
使用(或调整)给定的类来编写霍夫曼算法的编码和解码功能.最重要的是,不要忘记有一点乐趣!

该解决方案将验证您构建的频率表,以及基本的霍夫曼编码消息!
请注意,我们也会介绍一些随机测试!

我希望你喜欢这个Kata并且你有乐趣编码.所以不要忘记投票和排名这个习题,请;)

编程目标:

using System.Collections;
using System.Collections.Generic;
using System.Linq;
namespace HuffmanExample 
{
   //The class used for building up frequency tables.
   public sealed class HuffmanFrequencyTable
   {  
       public void Clear()
       {
           //Clears the frequency table
       }
           //Accepts an input string and creates a frequency table out of it.
       }
       public override string ToString() 
       {
           //Might be handy ;-)
           return string.Empty;


测试样例:

namespace Solution 
{
  using NUnit.Framework;
  using System;
  using System.Collections;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using HuffmanExample;
  [TestFixture]
  public class SolutionTest
  {
      public HuffmanTree Tree { get; private set; } = new HuffmanTree();
      private string input = @"The quick brown bit jumps over the lazy byte";


最佳答案(多种解法):

点击查看答案

更多关联题目:

免责申明

本博客所有编程题目及答案均收集自互联网,主要用于供网友学习参考,如有侵犯你的权益请联系管理员及时删除,谢谢
题目收集至https://www.codewars.com/
https://www.codewars.com/kata/to-compress-this-looks-like-huffman-compression

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值