基础算法题————散列/哈希/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质因子的合数

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

相关推荐
码达拉10 小时前
顺序表的总结及模拟实现
数据结构·c++
Boop_wu11 小时前
[ 数据结构 ] 时间和空间复杂度
数据结构
紫洋葱hh12 小时前
【数据结构】二叉搜索树
数据结构
·白小白13 小时前
【数据结构】——栈(Stack)的原理与实现
c语言·开发语言·数据结构
类球状14 小时前
数据结构(一)顺序表
数据结构
Rain_is_bad15 小时前
初识c语言————排序方法
c语言·开发语言·数据结构
一支闲人16 小时前
C语言相关简单数据结构:顺序表
c语言·数据结构·基础知识·适用新手小白
霖0017 小时前
FPGA的PS基础1
数据结构·人工智能·windows·git·算法·fpga开发
数据智能老司机19 小时前
图算法趣味学——桥和割点
数据结构·算法·云计算
John.Lewis20 小时前
数据结构初阶(11)排序的概念与运用
c语言·数据结构·排序算法