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

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

相关推荐
Hera_Yc.H2 小时前
数据结构之一:复杂度
数据结构
肥猪猪爸3 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
linux_carlos3 小时前
环形缓冲区
数据结构
readmancynn4 小时前
二分基本实现
数据结构·算法
Bucai_不才4 小时前
【数据结构】树——链式存储二叉树的基础
数据结构·二叉树
盼海4 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步4 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
珹洺5 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
几窗花鸢5 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn5 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论