此前我们了解过二叉树算法,哈希算法,二分法等等,其中由最常用的二叉树算法演变过来的哈希算法乃是从刚开始就学过的,此次因为一些项目的需要,要做一个类似ispell 的软件,其中会产生大量的对单词的查找操作,于是经过一翻研究,得出以下HASH算法,经过验证比一般的查表的FNV HASH算法产生的分布曲线基本没什么两样,并且在大部分的不同字典下,本算法要比查表的FNV HASH算法表现出速度更快,分布更均匀。但是因为是实验结果,所以暂时还没得出有效的数学推论,但是从大量的不同的字典测试数据来看,此算法确实效率不错。
由于以前没有涉及过相关的纯算法的设计,所以刚刚开始的时候,打算随便选用一种HASH,比如说用%除大质数,然后借此搭建一个比较强壮的测试环境,然后打算根据测试结果来改进HASH算法的模型。
最开始,我的HASH函数是这样的:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += *(p++);
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
非常简单,但是这是绝对不可取的,通过这个函数,我选取了一个23w词的字典做为测试,当HASH SIZE=1024的时候,震荡幅度相当大,那么如何来改进呢?首先想到可能产生的冲突的是这种情况:abcd和acbd,对于这两种单词来说,如果用上面的HASH函数,就一定会发生碰撞,为什么呢?因为每个字符少了关于它自己的位置信息,于是第一次改进版本的HASH函数就给每个字符加上了它的位置信息,将上面所描述的函数改进为:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += *(p++) * (p–str);
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
某种程度上来说,比不带位置信息产生的分布图要好多了,但是仍然非常的不均匀。那么接来分析产生分布不均匀的原因,因为是用的乘法,所以仍然太过于依赖字母产生的结果了。于是改用XOR操作,选用以下函数:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += (*(p++) * (p–str)) ^ sum;
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
虽然震荡幅度比较,不过做出来的regression line明显比上两张图片平得多了。但是结果仍然非常不好,从800到100的range太大。原因还是因为数据分布得不够均匀,于是思考单独的用加法来算是不是不太好,根据其他查表类HASH算法的过程,发现其大多都用了高低位来组合成最后的结果,于是我也采用了他们的方法:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register unsigned int h = 0;
register char *p = str;
while(p - s < len)
{
register unsigned short a = *(p++);
sum ^= a * (p - str);
h ^= a / (p - str);
}
return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
}
最后得出结论,不用查表的方法,而通过字符串本身的位置对字符本身进行修正的方法也能得到结果相当满意的HASH函数,之后换了几个大小不同的字典进行测试,得出的图象都大致和上图一致,非常令人满意。对于这个项目,包括如何检查单词错误,和自动修正等等相关的内容,会随着项目的完成一一在整理成文档,希望大家支持。
电脑软件管理是干什么的?解锁高效工作与生活的秘密武器
在这个智能飞速发展的时代,电脑已经成为我们工作、学习乃至娱乐不可缺少的工具。但是,随着软件应用的日益丰富,如何高效有序地管理这些软件,保证电脑的安全运行和数据安全,已成为我们面临的一大挑战。今日,使我们详细分析电脑软件管理的奥秘,看看它能给我们带来什么变化。一、程序安装与卸载:管理便捷,告别杂乱电脑软件管理的首要任务是...
电脑软件管理工具哪个好?
如今,随着信息技术的快速发展,电脑已成为我们工作、学习和生活中不可缺少的工具。但是,随着越来越多的程序安装在电脑上,如何有效地管理这种软件,以确保他们的正常运行和不断创新已经成为一个不容忽视的问题。为了帮助你更好地管理电脑软件,本文将推荐几款出色的电脑软件管理工具,各有特色,能够满足不同用户的需求。一、360软件管家3...
移动硬盘加密软件排行
在数据日益重要的今天,移动硬盘作为便携式存储设备,其安全性成为了用户关注的焦点。为了保护存储在移动硬盘上的敏感数据,选择一款高效可靠的加密软件至关重要。以下是一些备受推崇的移动硬盘加密软件排行。一、安企神软件安企神软件是一款专为中国市场设计的企业级数据加密软件,提供全面的数据保护。1、支持多种国际标准的加密算法,如AE...
移动硬盘加密软件哪个好用?
在数字时代,数据安全至关重要,尤其是对于那些携带敏感信息的移动硬盘。为了保护这些重要数据,挑选易于使用的移动硬盘加密软件至关重要。以下是一些备受推崇的移动硬盘加密软件,希望对您有所帮助。一、BitLockerBitLocker是微软Windows操作系统内置的加密工具,专为Windows10/11Pro版本或以上版本设...
内网终端安全管理系统怎么用?
在数字时代,企业信息安全已成为企业生存和发展的重要构成部分。内网终端设备做为企业信息的重要载体,其安全性至关重要。为了有效应对内网终端设备面临的各种安全威胁,内网终端安全管理系统应运而生。本文将详细描述内网终端安全管理系统怎么使用,希望对您有所帮助。一、组装配备1、安装:从官方渠道下载内网终端安全管理系统的安装包,并按...