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

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

相关推荐
良木生香44 分钟前
【C++初阶】C++编程基石:编码表&&STL的入门指南
c语言·开发语言·数据结构·c++·算法
cwplh2 小时前
平衡树学习笔记
数据结构·笔记·学习·算法
Not Dr.Wang4223 小时前
基于matlab的控制系统奈氏图及其稳定性分析
数据结构·算法·matlab
老约家的可汗4 小时前
深入浅出:Map与Set的核心原理与使用场景
数据结构·算法
承渊政道4 小时前
【递归、搜索与回溯算法】(穷举vs暴搜vs深搜vs回溯vs剪枝:一文讲清概念与用法)
数据结构·c++·算法·决策树·深度优先·剪枝·宽度优先
我不是懒洋洋4 小时前
【数据结构】栈和链表基本方法的实现
c语言·开发语言·数据结构·c++·链表·青少年编程·ecmascript
澈2075 小时前
C++ string操作指南:从入门到精通
数据结构·c++·算法
算法鑫探13 小时前
闰年判断:C语言实战解析
c语言·数据结构·算法·新人首发
木子墨51613 小时前
LeetCode 热题 100 精讲 | 并查集篇:最长连续序列 · 岛屿数量 · 省份数量 · 冗余连接 · 等式方程的可满足性
数据结构·c++·算法·leetcode
2501_9219608514 小时前
双相自指图与弦论边界非对易性的结构同源
数据结构