之前去面试,被面试官问到这么一个问题:
假如现在有一个设备,仅允许输入a~z以及空格这27个字符,请问,如何编码保存,能使其占用的内存空间最小?
刚开始答的时候,想到了用asc编码的形式,将27个字符分别用27位十进制数字进行保存,之后再将这27个十进制数字转为二进制存储到硬盘中,其占用的大小小于 25 字节(00000~11111),之后面试官又问:
如果当前字符串是连续的多个字符组成的,如何优化存储方式?
想了一会儿还差一点,面试官提示说可以进行标记,然后跟我讲,用剩下的五位(11100~11111)存储特殊字符(比如存储一个“#”)对每个字符进行标记存储,例如 #a#50# 就表示连续的五十个a #abc#100# 就表示连续的一百个 abc 用这种方式就可以做到连续的字符用定长存储,最后面试官又问:
如果这一串字符中,有的字符出现的概率十分大,有的字符出现的概率很小,怎么去优化存储空间呢?
这里答得不是很好,具体用到的数据结构应该是哈夫曼编码,所以在这复习一下哈夫曼编码。
哈夫曼编码(Huffman Coding)是一种编码方法,它使用变长的编码表对源符号进行编码,其中变长编码表是通过一种对字符出现几率统计的方法得到的,出现几率高的字符使用较短的编码,反之采用较长的编码,由此可以使得编码之后的字

本文介绍了在面试中遇到的字符串压缩问题,从最初的十进制编码到利用哈夫曼编码进行优化。哈夫曼编码是一种变长编码方法,通过对字符出现概率的统计,使得高概率字符使用较短编码,从而节省存储空间。文章详细阐述了哈夫曼编码的构建过程,包括按概率排序、合并节点、分配01标记以及如何根据二叉树生成编码,以实现无损压缩。
最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=102562763&d=1&t=3&u=5677995ed4414fbd8c8fd69af6a79a97)
1064

被折叠的 条评论
为什么被折叠?



