此前我们了解过二叉树算法,哈希算法,二分法等等,其中由最常用的二叉树算法演变过来的哈希算法乃是从刚开始就学过的,此次因为一些项目的需要,要做一个类似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函数,之后换了几个大小不同的字典进行测试,得出的图象都大致和上图一致,非常令人满意。对于这个项目,包括如何检查单词错误,和自动修正等等相关的内容,会随着项目的完成一一在整理成文档,希望大家支持。
网络信息安全解决方案:守护您的数字资产
我们的日常生活与数字世界紧密联系,从日常购物到工作文件,从家庭照片到个人信息,一切都在网络中。但你有没有想过,这类珍贵的数字资产,其实每日都面临着无形威胁?病毒、黑客、网络诈骗……他们就像潜伏在黑暗中的“窃贼”。他们常常准备盗取你的信息,不要担心,今天我们将讨论如何给你的数字资产找到一个可靠的“保镖”。一、数字资产,你...
办公必备!五款超好用的电脑操作记录软件推荐
各位职场小伙伴们,是不是经常觉得一天下来忙忙碌碌,却想不起具体做了哪些工作?或者,有时候急需找到某个文件的修改记录,却只能无奈地从头翻到尾?别担心,今天就来给你揭秘五款超实用的电脑操作记录软件,它们简直是办公族的福音,让你的工作效率翻倍,还能轻松管理你的数字生活!一、记录小能手:Evernote这款软件就像是你的私人助...
内网补丁分发管理系统的重要性与必要性
企业的网络安全面临着前所未有的挑战。黑客攻击、病毒攻击、数据泄漏……这听起来令人头疼,还总是威胁着我们的企业安全。内网补丁分发管理系统是守护公司安全隐藏极大巨盾,你可能没意识到它的重要性,但阅读了这篇文章后,你会对它有不同的看法!一、为啥内网补丁分发管理系统这么重要?简单来说,它就像我们公司的“网络安全管家”,能够及时...
电脑桌面管理技巧:让你的工作空间焕然一新
你是不是每日打开电脑,面对乱七八糟的桌面就会感到头疼?文档、文件夹、相片、快捷方式...各种图标堆满了,找文档如同大海捞针,效率直线下降。别担心,今天就来说说电脑屏幕管理方法,使你的工作空间瞬间秩序井然,工作效能翻番!一、为啥得管管电脑桌面?一个干净的桌面不仅提高了大家工作效率,并且可以让我们的情绪更快乐。如果每日打开...
上网行为管理设备使用指南,让安全上网成为习惯
大家是不是觉得每日上网如同呼吸一样自然?但是你知道吗?在享受网络带来的便利的同时,大家也面临着各种安全风险。比如,不小心点击诈骗网站,下载恶意软件,泄露个人隐私……这都是网络世界的“大坑”!为了让大家更安全地上网,今天就来谈谈网络行为管理设备,以及如何使用它,让安全上网成为我们的新习惯!一、为啥需要上网行为管理设备?简...