1.今天继续学习了kmp算法
2.浅浅对hash算法有一定的了解
一.
KMP算法
这是一个字符串查找的算法,我们之前学习的字符串查找都是暴力穷举,然而这个效率太低,于是有三位大佬发明了线性的KMP算法。
算法的核心思想是找到最长的相等的前缀和后缀,然后可以直接跳到后缀的部分,继续进行比较,让母串的i不回退,从而减少复杂度。
其次,KMP算法需要一个next的数组来记录下一个的位置,KMP算法感觉需要打个表就是以子字符串进行打表记录,对子字符串进行,从而提高工作的效率
二.
学了hash算法,我了解到以下几点:
1.hash算法类似于打表,但是打表是我们在知道下标的情况下,取出相应的值,而hash算法能够将字符串这一类的东西变成下标,继而去访问它,得到结果。
2.hash算法是不可逆的,我们可以通过字符串得到一个hash值,而通过hash值我们无法得到字符串。
3.我们每一次输入不同的参数时,我们要保证得到的hash结果不能相等,而当我们输入相同的参数时,我们应该保证得到的hash值时一定相等的。
4.一个好的hash函数要降低它的碰撞率,降低碰撞率的方法有:
(1)开放地址法:我们遇到碰撞之时,在该位置的有规律的往后挪几个位置,一般会采用平方解决。
(2)双hash法,我们可以使用俩个hash函数,去存放。因为在俩个hash函数的加持下,能降低碰撞。
(3)链式法:在碰撞的位置上,我们可以使它变成链表或者指针数组,存储相应的hash值。
(4)建立公共溢出区,让碰撞的hash放在另外一个存储区域。
5.hash函数的创建有很多方法,我们可以使用加减乘除,但是这个运算很容易产生碰撞,我们可以叠加位运算,求余素数使它变的复杂。