哈希算法(急!在线等)

xsp919 2005-07-18 08:57:52
目前有一个很大的数组需要存储,但是ROM不够。所以需要压缩,数组中的需要存储的值有大写字母和数字还有几个符号。原来存储的是每个字符用8bit。现在想压缩到每个字符只用6bits。大家有什么好的方法可以实现吗?拜求!听说可以使用哈希算法。但是我不是很清楚。大家帮帮忙~~谢了:)
...全文
1068 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luhanwenboy 2005-08-03
  • 打赏
  • 举报
回复
回复:luhao007_noknife
你提出的方案应该是哈弗曼编码 ,编码的长度是不一样的,请怎样从ROM读取数组而又不引起二义?
ywchen2000 2005-08-03
  • 打赏
  • 举报
回复
HASH就是通过一个hash函数,计算字符的值,然后将值相同的放在一起.
LoveYouJustOneDay 2005-07-28
  • 打赏
  • 举报
回复
这个还要看你的数据
有些数据是不能压缩的
由信息熵决定
luhanwenboy 2005-07-28
  • 打赏
  • 举报
回复
看看每个字符的8bit中是否有2bit没用到。如果这2bit没用到(即这2bit都相同),就可以把字符拆成4个2bit插入到4个字符没用到的2bit中
kingbin 2005-07-19
  • 打赏
  • 举报
回复
补充一下,如果数组中字符的顺序有某种组合性,那么就可以有更高压缩率的算法
kingbin 2005-07-19
  • 打赏
  • 举报
回复
修正一下
最高频字符01然后001然后0001 ... 这里应该是
{01,001,011,0001,0011,0111 ...}
kingbin 2005-07-19
  • 打赏
  • 举报
回复
哈希表hash 只能提高数据的搜索速度,不能减少存储空间。

如果谈效率luhao007_noknife()谈的这个方法应该比较好的了,
{A...Z} 26个字符 + {0...9} 10个 如果剩下的字符不超过28个可以用6bit 最多存储64种类型
建立一个map,
压缩和解压分别是正逆转换map.

另外一种就是按照字符出现的频率,先写一个函数分析数组中每个字符出现频率
最高频字符01然后001然后0001 ...
这个算法可以获取更小的存储空间,可是需要one bit by on bit的分析,牺牲的是时间,效率没有前面的那个好
luhao007_noknife 2005-07-19
  • 打赏
  • 举报
回复
可以借鉴下BASE 64的算法。它就是建立了一个表。
因为你的符号和字母什么的一共家起来差不多有64个。
这样用6Bit就可以表示了。
比如A:000001,B:000010等等。
然后,把4个字符(总共24Bit么)拼成3个字符表示出来。
等你需要的时候,再把3个字符变回原来的那4个字符好了。
BASE 64的算法网上有很多,可以自己去找。

不过BASE 64不是压缩,是加长表示(即用字母和数字和几个字符表示所有字符)
是4个表示原来的3个。
你把它的反算法当做你的算法就可以了。
xsp919 2005-07-19
  • 打赏
  • 举报
回复
谢楼上的,我看看去。我也是这么想。只是不知道有什么更好的方法。自己想的总觉得不是很好。比较麻烦。
oyljerry 2005-07-19
  • 打赏
  • 举报
回复
主要根据数据的冗余度
shine51151 2005-07-19
  • 打赏
  • 举报
回复
厉害 等一下我也来问问
okdavinci 2005-07-19
  • 打赏
  • 举报
回复
利害.学习!
Jagen在路上 2005-07-18
  • 打赏
  • 举报
回复
zlib
boxban 2005-07-18
  • 打赏
  • 举报
回复
用现成的压缩库呀
shxchenwind 2005-07-18
  • 打赏
  • 举报
回复
一个字节8bit已经是操作最低的存储单元了!

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧