一些看似复杂的问题,如果采用Hash表数据结构和查找算法,往往很容易解决,所以当读者发现其他数据结构和算法都无法解决的问题,不妨考虑Hash查找算法,用Hash表解决问题的关键是确定它的Key(关键字),确定了关键字,再确定关键字对应的值(比如该关键字出现的次数),建立对应的Hash表,建立Hash表之后,就可以通过关键字查找Hash表来解决对应的问题。
下面就研究几个利用Hash表解决的典型问题:
问题1:现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少兄弟单词(单词中字母相同但次序不同,比如our和rou)?
思路与解答:根据兄弟单词的定义,在兄弟单词中,各个字母对应的个数是相同的,于是可以定义一种以单词中字母个数为标志的特征码,比如,对单词addb定义关键字为a2b1d1,dddabc的关键字是a1b1c1d3,依次类推,根据关键字建立Hash表,统计每个单词对应的兄弟单词的数量。然后对给定的单词,搜索Hash表就可以得到这个单词的兄弟单词数量。
问题2:搜索引擎会通过日志文件把用户每次检索使用的所有检索都记录下来,每个查询串的长度为1~255字节。假设目前有一千万个记录,这些查询串的重复度比较高,虽然总数是一千万,但如果除去重复后,不超过三百万个。一个查询串的重复度较高,说明查询它的用户越多,也就是越热门,请你统计最热门的10个查询串,要求使用的内存不能超过1GB.只要给出思路和对应的数据结构。
分析:一旦遇到字符串或其他与频率相关的问题,往往可以用Hash表来解决。对于本题,可利用Hash算法,逐次读入查询串,计算它的MD5 Hash值,保存在内存数组中,同时统计每个Hash值对应的频度并记录下该MD5值对应的字符串,建立起Hash表,然后访问该Hash表,选出排名前十的统计频度,取出对应的日志串,就是要找的热门字符串。
typefef struct_hotstr
{
char str[255];
int count;
}