字符串压缩的一些算法
来源:互联网 发布:qq关系数据库在线查询 编辑:程序博客网 时间:2024/05/01 14:16
应用中,经常需要将字符串压缩成一个整数,即字符串散列。比如下面这些问题:(摘自JULY的博客 http://blog.csdn.net/v_july_v/ )
(1)搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。请找出最热门的10个检索串。
(2)有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词。
(3)有10个文件,每个文件1G,每个文件的每一行存放的都是用户的query,每个文件的query都可能重复。要求你按照query的频度排序。
(4)给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url。
(5)一个文本文件,大约有一万行,每行一个词,要求统计出其中最频繁出现的前10个词。
这些问题都需要将字符串压缩成一个整数,或者说是散列到某个整数 M 。然后再进行取余操作,比如 M%16,就可以将该字符串放到编号为M%16的文件中,相同的字符串肯定是在同一个文件中。通过这种处理,就可以将一个大文件等价划分成若干小文件,而对于小文件,就可以用常规的方法处理,内排序、hash_map等等。最后将这些小文件的处理结果综合起来,就可以求得原问题的解。
下面介绍一些字符串压缩的算法。
方法1:最简单就是将所有字符加起来,代码如下:
unsigned long HashString(const char *pString, unsigned long tableSize)
{
unsigned long hashValue = 0;
while(*pString)
hashValue += *pString++;
return hashValue % tableSize;
}
分析:如果字符串的长度有限,而散列表比较大的话,浪费比较大。例如,如果字符串最长为16字节,那么用到的仅仅是散列表的前16*127=2032。假如散列表含2729项,那么2032以后的项都用不到。
方法2:将上次计算出来的hash值左移5位(乘以32),再和当前关键字相加,能得到较好的均匀分布的效果。
unsigned long HashString(const char *pString,unsigned long tableSize)
{
unsigned long hashValue = 0;
while (*pString)
hashValue = (hashValue << 5) + *pString++;
return hashValue % tableSize;
}
分析:这种方法需要遍历整个字符串,如果字符串比较大,效率比较低。
方法3:暴雪公司使用的一个经典hash算法。有篇博客实现这个算法,非常好。可以参考这个。
http://blog.csdn.net/eaglewood2005/article/details/4394583
- 字符串压缩的一些算法
- 字符串压缩的一些算法 .
- 字符串压缩的一些算法
- 字符串压缩的一些算法
- 字符串的压缩算法
- 字符串的一些算法
- 字符串的一些算法
- 【算法分析】特定类型字符串的压缩
- 经典算法:字符串的匹配压缩
- 关于字符串的一些算法
- 基于Zlib算法的流压缩、字符串压缩源码
- 基于Zlib算法的流压缩、字符串压缩源码
- 字符串压缩算法
- C字符串压缩算法
- 字符串压缩算法
- 字符串压缩算法
- 算法-字符串压缩
- 字符串压缩算法
- cenos上安装eucalyptus完整教程及问题解决
- 函数指针和指针函数
- android 入门学习笔记 判断网页地址 邮箱 电话号码 符合要求的加链接~
- 【Linux C 多线程编程】互斥锁与条件变量
- 解决用B表跟新A表数据,如果A表中没有,则把B表的数据插入A表(merge into)
- 字符串压缩的一些算法
- MPEG2、H.263、H.264协议效率对比
- C#类型转换:隐式转换和显式转换
- 创建56个民族数据库表SQL语句
- 向EXCEL模板文件中写入数据和插入新行
- 写个javascript的事件委托
- 函数参数的传递问题(指针的指针)
- Gridpanel数据加载成功后,触发事件,让表格第一行的数据显示在下面的formpanel
- POJ 1149 PIGS(最大流 经典构图)