前边主要是STM32的学习,之后发现C语言总会考一些基础算法题,因此之后会学习哈希、查找、排序、递归和复杂度5个部分,并每天在牛客网上每天练习几道,加深印象。
首先是哈希算法
通俗来说:假设有一本新华字典需要你全部抄下来,当你抄到111页时,你将第111页的字符个数数了一遍,然后将手稿的第111页字符个数也数了一遍,如果不一致就需要重新抄,这就是哈希。
不可逆过程
哈希表相当于python中的字典,存在键、值的关系,与数组不同的存储数据方式
1、假设有一个农场主,他有许多种类的蛋,如何区分,使用哈希:
由于哈希表中的下标是字符,不能通过字符找到内存地址,因此需要对其进行运算之后找到内存地址,对键进行运算就是哈希函数!
2、可变长度变成相对固定长度的方法:对字符进行求余
假设目前存在一个哈希表只能存储5个键值对,现在要存入USA,分别求出U、S、A对应的ASCLL码55、53、41,将3个数相加对5求余(因为哈希表一共5个键值对,因此对5求余)得4,此时将USA放入4,这也表明哈希是不可逆的,不能通过4得到USA这个字符。
3、不同输入出现相同输出
当再次输入一个Asia时,经过计算得4,此时和之前的USA输出一致,此时就发生了冲突/碰撞,为了解决以上问题,主要有两种方法
(1)封闭寻址法
就是在4的位置添加链表法,把哈希表的位置设置成链表,当某个节点发生碰撞时,直接把插入的数据放到链表中,需要查看某个值时,使用哈希函数,得到的索引值进入链表去逐个寻找,但可能会出现集群现象(固定在某几个节点)
(2)开放寻址法
当发生碰撞的时候就往下走,如果有坑就放入,没有就继续找,会发生数据聚集现象,每次需要花费大量时间去探测该区域,出现一次聚集现象
二次探测法:发生冲突时,先往下找,又冲突,放到2^2次方4,再冲突,放到3^2次方9,以此类推
因此有双重哈希、布谷鸟哈希等方法
4、MD5和SHA算法
将数据通过算法转变为固定的值(值称为摘要)
哈希算法作用:登陆网址的用户名和密码所存储的数据库,如果被黑客窃取,他也无法知道原来的值是什么,且在登录时如果用户输入的密码生成的数和数据库中的不一样,则密码错误。
牛客网的一些题目记录:
譬如发生冲突时,就需要比较
查找长度:一开始是5,没有数据直接放入,查找长度是1;接下来是3,直接放入,接下来是1,直接放入,又出现3,需要查找2次才行,以此类推
除留余数法:最好找小于或等于散列表长度的质数!或不包含小于20质因子的合数
今天就学习到这,明天进行查找的学习