基础算法题————散列/哈希/Hash

前边主要是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质因子的合数

今天就学习到这,明天进行查找的学习

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hssfscv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值