算法4B-----散列

  • 散而列之

  • 建立快速查询的索引

  • BC[j,‘x’],j相当于身份证号,

call-by-value

  • 需要查电话簿才能拨打电话

  • 建立一个表格,直接输索引,就可以打出响应的值

java:hashMap+hashTable

  • 可以把key-value存储到容器中
  • 通过key直接获取value

perl:%hash type

python:dictionary class

ruby:hash table

hashing:table+function

  • 昨天的例子

    • BC表,字符集中有多少个字符就有多少项
    • 中间的每一项都记了一个shift
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rjpaqaHj-1601905457488)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005195132162.png)]
    • 但是unicode这么大集合的字符串就不可能一下子开这么大的数组
  • 清华大学的电话簿

    • 新建一个数组
    • 00000000~99999999
    • 首先开不了这么大的数组,其次利用率太低
    • 好处查询O(1),坏处没有这么大的空间
  • 解决思路

    • 建一个虚拟的表,假想开那么大的空间

    • 分成两步

    • 1.经过一次函数计算才映射到散列表上

      2.从散列表上再去快速查询,这个散列表是10的(4~5)次方级别<<10^8,几万的数量

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lZL7ofwo-1601905457497)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005195829518.png)]

    • 取一个素数90001,数组容量是90000,通过取模运算%90001

    • 最饶头的地方:

      • collison:碰撞、冲突
      • 不同的电话映射到一个entry中
      • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LIoxGdGi-1601905457502)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005200127999.png)]

Hashing:hash function

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-86zBtfSB-1601905457514)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005200642108.png)]

  • 取余,不动点0,局部的相关性(邻居)
  • (a*key+b)%M,让0点偏移b
  • 选择数位法
  • 平方,取中间位上的数字

polynomial(移位法)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DuIBQJta-1601905457521)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005200827821.png)]

  • 把前五位变成后五位,把后27位变成前27位
  • 这种hash方式被验证在英文字符中产生的哈希碰撞是最少的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5eg1ZmnU-1601905457527)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005201346838.png)]

  • 将一个英文字符串的每一个字母的ASCII码相加获得的和作为hash算法映射的值

hashing:open hashing + closed addressing

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QnFbXBPV-1601905457531)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005202052086.png)]

  • 碰撞的同义词都放在一个哈希桶内
  • 定址:任何一个桶内存的都是它的同义词,是封闭的散列
  • 大量的浪费:链表内的每一个链接,都会占4个字节,最后的利用率也不会超过50%
  • 还有一个缺点:缓存,链表的跳跃可能的物理内存离的非常远

hashing:closing hash + open addressing

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MlW6Av5X-1601905457533)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005202819681.png)]

  • 第一行图:把非同义词放在一个桶内,依次找下去,

    • 貌似比上一种拉链的方法麻烦
    • 每次总是要找隔壁,这么下去,实际还有很多空的位置
  • 第二行图:碰撞后跳离的步长是逐渐增大的,而不是恒定为1
    • 叫做平方试探
    • 注意不是二次散列,有很严重的歧义

应用 bucketsort : basic

  • 排序

  • 把某些元素塞到指定的key下面

  • 把散列表中非0的元素取出来

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w6SJA6R4-1601905457536)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005203951124.png)]

  • n >> m时才适用

bucketsort:stability+deduplicate()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zCZjun0D-1601905457539)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005204038626.png)]

  • 重复元素都会在指定位置继续接下去
  • 算法的稳定性

bucketsort:max-gap

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aim5v62b-1601905457541)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005204546749.png)]

  • 无限长数轴

  • 期望的方法复杂度是O(n)的

  • 从lo到hi分n-1个桶,再加一个桶,一共n个桶,左闭右开

  • 绿的是没有点落在里面,红的是有点落进去

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xMY8VSfb-1601905457545)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005205020610.png)]

  • 每一个红色段只关心最左和最右的值,绿色段全忽略,一个gap的最右边值和下一个gap最左边的值构成一个gap,找到那个最大的,所有的gap不会小于平均宽度((hi-lo)/ (n-1)),红色内部的gap是肯定小的

  • O(c*n)就是O(n)

radixsort:lexicographic order

  • 字典序
  • 依次比较字母,如果相同就往后比较,如果不相同大的就是更大者
  • 实现这种基数排序

correctness = stability

stability of bucketsort

  • 准备一个桶
  • 一个四位数,先从个位比较,通过bucket sort
  • 逐渐往大位继续滚动排序下去
  • 正确性是因为前一次排序已经确定了,比较千位相同,就去比较百位,但是百位已经比较过了,所以能找到答案
  • O(d X n) 数位是d,所以又是O(n)

bitmap:structure

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZ5RyL88-1601905457548)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005210436141.png)]

  • 存整数
  • 开一个0到n的数组
  • 得到一个数据结构
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jAn7a2BZ-1601905457551)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005210815123.png)]
    • set:把对应的0翻转成1
    • clear:减除掉那个元素
    • test:判断这个k是否属于这个集合

实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jljKvacO-1601905457556)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005210905805.png)]

  • 找到对应的比特

    • test方法
    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3H1E7kfJ-1601905457561)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005211525495.png)]
  • set方法
    • 把那一位强置为1
  • clear方法
    • 把那一位强置为0

bitmap: eratosthenes idea

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6aNagfD7-1601905457565)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005211940698.png)]

  • 最早估算地球直径的人

  • 羊皮纸算素数

    • 素数筛法

    • 把0和1排除

    • 从某一个数的倍数依次找下去,插破,置为蓝色

    • 实际上就是bitmap

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-weIoREO7-1601905457569)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005212141673.png)]

    • 新建一个bitmap
    • 排除0和1
    • 从2开始,判断它是否是素数,如果不是素数,从它的2倍、3倍下去,在它未超过自己的计算范围之内,去把它在位图上扎破,

bitmap initialization O(1)

  • J. hopcroft cornell tuning

  • 初始化时间只花O(1),但是并不是所有情况都需要这么做,有些时间简单用一个for循环遍历初始化是更好的

  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qPKHvGsh-1601905457573)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005213141790.png)]

    • 校验环

    • f[14] = 4 t[4] =14 符合

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxkHKu8W-1601905457576)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005213343238.png)]

    • f[19] = 6 t[6] = 19 top=6 6的左侧 所以不符合

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QLu7zN66-1601905457580)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005213517347.png)]

    • f[24] = 2 t[2] = 21 f[21] = 2

  • 比如在11的位置插入一个元素

    • f[11] 要变成6 t[6]要变成11 top[6] 等于7
  • clear操作,去掉校验环,

    • 最简单的操作,将top–,top实际就是一个栈,如果不是删除栈顶元素,怎么操作?

    • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tj4jV1JS-1601905457583)(C:\Users\liusiping\AppData\Roaming\Typora\typora-user-images\image-20201005214124340.png)]

    • 方法2:删除掉的窟窿,为了保持整体的完整性,用栈顶元素来充填,与原先栈顶配对的f也会变成新的t的位置

算法4B-----散列相关推荐

  1. 数据结构之查找算法:散列查找

    查找算法:散列查找 思维导图: 散列函数和散列表: 构造散列函数的要求: 构造散列函数的方法: 直接定址法: 除留取余法: 数字分析法: 平方取中法: 折叠法: 解决冲突的方法: 开放定址法: 线性探 ...

  2. Java 国密算法 SM3 散列哈希使用

    Java 国密算法 SM3 散列哈希使用 文章目录 Java 国密算法 SM3 散列哈希使用 引入依赖 计算散列哈希 引入依赖 <dependency><groupId>org ...

  3. 数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法)

    数据结构与算法 ~ 查找 ~ 散列查找(哈希~线性探查法和二次探查法) /*search-hash*/ #include<math.h> #include<stdio.h> # ...

  4. 基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

    文章目录 安全测试中: 加密解密-识别特征&解密条件 其他密文特点见: 解密实例-密文存储&数据传输 课件附加资源百度云 安全测试中: 密文-有源码直接看源码分析算法(后端必须要有源码 ...

  5. 数据结构与算法——17. 散列(哈希)与完美散列函数

    文章目录 一.散列(Hashing)的概念 举例说明 二.完美散列函数 1. 数据的一致性校验 2. 完美散列函数用于数据的一致性校验 一.散列(Hashing)的概念 在查找算法中,如果数据项之间是 ...

  6. 【常用算法】散列(hash)

    散列(hash)定义 将元素通过一个函数(H(key))转换为整数,使得该整数可以尽量唯一的代表这个元素 散列最基本的对应关系就是对应其本身H(key)=key(很常用) 先看一个简单的问题 随机给一 ...

  7. 《算法笔记》-各种排序算法、散列、递归、贪心、二分、双指针、随机选择算法(知识点+例题+代码)

    一.排序 1.冒泡排序 进行数组大小-1趟排序 int a[]={3,4,1,5,2};//从小到大排序 //第一趟 3,4,

  8. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)...

    2019独角兽企业重金招聘Python工程师标准>>> 数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊-- ...

  9. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

  10. 数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)——Web网络系列学习笔记

    数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们--帕蒂.道格.苏珊--每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4 ...

最新文章

  1. 机房收费系统【VB版】——上下机
  2. CQOI2015 任务查询系统
  3. Android开发究竟该如何学习,含泪整理面经
  4. linux模拟树莓派,树莓派使用入门:树莓派上的模拟器和原生 Linux 游戏
  5. java数据类型代表价格_解读Java数据及数据类型内幕
  6. 下列不属于计算机图形学的应用的是,《数字图形设计》题目与答案3
  7. Angular应用的依赖注入调试
  8. 32岁被裁补偿N+2:“感谢裁我,让我翻倍!” 网友:求同款被裁!
  9. java中filehandler_java – 如何配置特定FileHandler的属性
  10. 我密集面试了若干位Java后端的候选人,给广大程序员的一点建议
  11. 【快速入门Linux】6_Linux命令—用户权限相关命令
  12. 爱奇艺《青春有你3》节目组决定终止节目录制
  13. php ci_controller,php – CodeIgniter 2:如何多次扩展CI_Controller?
  14. k近邻分类器的使用:简单例子
  15. 算法总结之 在数组中找到一个局部最小的位置
  16. Django的数据迁移
  17. 【Java小游戏】飞翔的小鸟项目介绍
  18. 华三交换机配置DHCP中继
  19. 显示技术发展方向:柔性化、薄膜化、微小化、阵列化
  20. win10计算机本地组策略编辑器,win10本地组策略编辑器打不开最佳解决方法

热门文章

  1. Java并发编程思维导图(知识点总结,含面试题整理)
  2. 多链路聚合路由在消防智能指挥系统中的应用
  3. uniapp实现底部凸起的tabbar
  4. 【笔记】 BLheli电调与Dshot通讯学习笔记
  5. 无需手机仅用pn532 完成小米手环3NFC 校园卡模拟
  6. snmp++开发实例一
  7. 文件upload和download
  8. 区块链系统探索之路:钱包地址的实现
  9. 西南大学计算机博士毕业难度,李明亮985本科,为何读博他读了9年,不毕业
  10. springboot+vue项目之MOBA类游戏攻略分享平台(java项目源码+文档)