• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中压缩字符串的简单算法小结

C语言中压缩字符串的简单算法小结

作者:wuzhekai1985 字体:[增加 减小] 来源:互联网 时间:2017-05-28

wuzhekai1985 通过本文主要向大家介绍了c语言字符串压缩算法,字符串匹配算法c语言,c语言字符串比较,c语言字符串输入,c语言字符串等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

应用中,经常需要将字符串压缩成一个整数,即字符串散列。比如下面这些问题:
(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;
}
</div>

分析:如果字符串的长度有限,而散列表比较大的话,浪费比较大。例如,如果字符串最长为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;
}
</div>

分析:这种方法需要遍历整个字符串,如果字符串比较大,效率比较低。

方法3:利用哈夫曼算法,假设只有0-9这十个字符组成的字符串,我们借助哈夫曼算法,直接来看实例: 

#define Size 10 
int freq[Size]; 
string code[Size]; 
string word; 
struct Node 
{ 
 int id; 
 int freq; 
 Node *left; 
 Node *right; 
 Node(int freq_in):id(-1), freq(freq_in) 
 { 
  left = right = NULL; 
 } 
}; 
struct NodeLess 
{ 
 bool operator()(const Node *a, const Node *b) const 
 { 
  return a->freq < b->freq; 
 } 
}; 
 
void init() 
{ 
 for(int i = 0; i < Size; ++i) 
  freq[i] = 0; 
 for(int i = 0; i < word.size(); ++i) 
  ++freq[word[i]]; 
} 
void dfs(Node *root, string res) 
{ 
 if(root->id >= 0) 
  code[root->id] = res; 
 else 
 { 
  if(NULL != root->left) 
   dfs(root->left, res+"0"); 
  if(NULL != root->right) 
   dfs(root->right, res+"1"); 
 } 
} 
 
void deleteNodes(Node *root) 
{ 
 if(NULL == root) 
  return ; 
 if(NULL == root->left && NULL == root->right) 
  delete root; 
 else 
 { 
  deleteNodes(root->left); 
  deleteNodes(root->right); 
  delete root; 
 } 
} 
void BuildTree() 
{ 
 priority_queue<Node*, vector<Node*>, NodeLess> nodes; 
 for(int i = 0; i < Size; ++i) 
 { 
//0 == freq[i] 的情况未处理 
    Node *newNode = new Node(freq[i]); 
  newNode->id = i; 
  nodes.push(newNode); 
 } 
 while(nodes.size() > 1) 
 { 
  Node *left = nodes.top(); 
  nodes.pop(); 
  Node *right = nodes.top(); 
  nodes.pop(); 
  Node *newNode = new Node(left->freq + right->freq); 
    newNode->left = left; 
    newNode->right = right; 
    nodes.push(newNode); 
 } 
 Node *root = nodes.top(); 
 dfs(root, string("")); 
 deleteNodes(root); 
} 
</div>

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言求解最长公共子字符串问题及相关的算法分析
  • 一些C语言中字符串的算法问题解决实例小结
  • C语言中压缩字符串的简单算法小结
  • 字符串的组合算法问题的C语言实现攻略
  • C语言字符串快速压缩算法代码

相关文章

  • 2017-05-28static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
  • 2017-05-28floyd算法实现思路及实例代码
  • 2017-05-28深入解析unsigned int 和 int
  • 2017-05-28C语言for语句用法详解
  • 2017-05-28Linux 软件看门狗 watchdog使用介绍
  • 2017-05-28C语言初学者代码中的常见错误与问题
  • 2017-05-28C++基础入门教程(一):基础知识大杂烩
  • 2017-05-28深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
  • 2017-05-28讲解C++中的枚举类型以及声明新类型的方法
  • 2017-05-28浅谈C语言函数调用参数压栈的相关问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • linux C++ 获取文件绝对路径的实例代码
    • C语言游戏必备:光标定位与颜色设置的实现方法
    • C++ AfxBeginThread的介绍/基本用法
    • C语言编程中统计输入的行数以及单词个数的方法
    • 数据结构课程设计- 解析最少换车次数的问题详解
    • c++函数中的指针参数与地址参数区别介绍
    • C++编程中的格式化输出详解
    • C++ 动态创建按钮及 按钮的消息响应
    • VC++操作SQLite简单实例
    • 详解C语言编程中的函数指针以及函数回调

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有