文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。

7 散列表+链表的应用

很多情况下散列表会和链表一起使用。散列表可以通过key查找value。链表可以按照value进行排序。这样就能通过value查找key,也可以通过查找value的区间范围查找key。

7.1 LRU 缓存淘汰算法

基本的LRU
 单纯的LRU是维护了一个访问时间从大到小的有序链表。因为缓存大小有限,当超过缓存的时候,需要删除表头。
 当要缓存一个数据的时候,先查找数据在链表中是否存在。如果存在,则删除,插入到表尾。如果不存在,则看空间是否充足。空间充足,直接插入到表尾;如果空间不足,则删除表头,插入到表尾。
LRU支持的操作有:
 1 插入数据
 2 删除数据
 3 查找数据
 这三个操作都涉及查找操作。链表的查找操作时间复杂度是O(n)。散列表+链表就可以将查找操作变为O(1)。
 
 一个双向链表+散列表。每个节点=数据+前驱指针+后继指针+hnext指针。hnext是为了把节点串在散列表中。前驱指针、后继指针是为了形成一个双向列表。
 查找数据的过程。我们通过散列表查找数据,时间复杂度O(1)。找到之后把它移动到双向链表的尾部。
 删除数据的过程。我们通过散列表查找数据节点,利用前驱后继指针删除这个节点。
 插入数据的过程。需要先查找这个节点是不是存在。存在,移动到双向链表的尾部。不存在需要插入到散列表对应的槽位,和双向链表的尾部。如果超出缓存空间,则把双向链表头部元素删除。
 所有查询的操作通过散列表完成。这三个操作都可以在O(1)时间内完成。

7.2 Redis有序集合

有序集合中每个对象有两个重要属性key和value。
有序集合需要支持的操作有:
1 添加一个成员对象。
2 按照key删除成员对象。
3 按照key查找成员对象。
4 按照value区间查找对象。
5 按照value从大到小排序对象。
 在跳表,我们可以实现按照value排序数据。散列表可以按照key组织数据。即可以在O(1)实现上述5种操作。
 Redist还可以按照排名查找对象。这个功能在以后讲。

7.3 Java LinkedHashMap

Java的LinkedHashMap实际是一个LRU缓存的实现版本。是一个散列表+双向列表。遍历Map中的元素,遍历的顺序是按照访问时间从小到大输出。

7.4 散列表+链表结构特点

散列表:支持高效地插入、删除、查找操作。
双向链表:按照某种顺序遍历数据。
两者结合在一起就可以实现按照某种顺序遍历散列表中的数据

7.5 应用

假设猎聘网有 10 万名猎头,每个猎头都可以通过做任务(比如发布职位)来积累积分,然后通过积分来下载简历。假设你是猎聘网的一名工程师,如何在内存中存储这 10 万个猎头 ID 和积分信息,让它能够支持这样几个操作:
根据猎头的 ID 快速查找、删除、更新这个猎头的积分信息;
查找积分在某个区间的猎头 ID 列表;
查找按照积分从小到大排名在第 x 位到第 y 位之间的猎头 ID 列表。
 以积分排序构建一个跳表,按照ID做key构建一个散列表。
 在散列表中根据ID查找、删除、插入积分信息。
 在跳表查找积分区间内的ID。
 最后一个操作以后实现,目前做不到。

数据结构四——散列表(下)相关推荐

  1. 数据结构四——散列表(上)

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1散列表的由来 从数组随机访问特性说起. 数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6 ...

  2. 第九章:数据结构四兄弟——列表(下),痴月熊学python

    痴月熊学Python 文章目录 痴月熊学Python 往期文章 前言 一.对象.方法() 二.列表方法 2.1.列表内置函数 2.2.列表追加元素 2.3.列表插入元素 2.4.列表删除元素 三.列表 ...

  3. 数据结构之散列表(七)

    前言 一.什么是散列表 散列表是如何组织数据的呢? 散列表的基本概念 二.Hash算法的设计 什么是Hash算法 Hash算法的应用场景 三.散列表冲突的解决 1. 开放寻址法 2. 链表法 3. 开 ...

  4. 第八章:数据结构四兄弟——列表(上),痴月熊学python

    痴月熊学Python 文章目录 痴月熊学Python 往期文章 前言 一.创建列表 二.读取列表 三.删除和修改元素 总结 系列文章 往期文章 第一章:Python-新人报道 第二章:小学生都会的数学 ...

  5. 查找、插入、删除都很快的数据结构(散列表vs红黑树vs跳表)

    散列表 散列表的插入.删除.查找操作的时间复杂度可以做到常量级的 O(1),非常高效. 平衡二叉查找树(红黑树) 二叉查找树在比较平衡的情况下(红黑树是一种平衡二叉树),插入.删除.查找操作时间复杂度 ...

  6. 利用开放定址法实现散列表的创建、插入、删除、查找操作_快速入门数据结构:散列表(上)...

    散列表与散列算法 散列表的英文叫"Hash Table",我们平时也叫它"哈希表"或者"Hash 表",散列表用的是数组支持按照下标随机访问 ...

  7. 数据结构(55) 散列表(哈希表,hash table,hash map)

    目录 1.散列表的基本概念 2.散列函数的构造方法 3.常用的散列函数 3.1.直接定址法 3.2.除留余数法 3.3.数字分析法 3.4.平方取中法 3.5.乘法哈希法(The Multiplica ...

  8. 【数据结构】散列表知识点

    散列存储的特性 散列存储:散列表,采用的存储方式是散列存储.那么何为散列存储呢?散列存储是根据元素的关键字直接计算出该元素的存储地址,又称哈希(Hash)存储.采用散列存储的方式存储数据时,具备的优点 ...

  9. c++数据结构:散列表(哈希)

    记录的存储位置与关键字之间存在对应关系,对应关系---hash函数 Loc(i)=H(keyi) 假设散列函数为H(key)=k 数据为:1 2 5 8 9 6 7  访问的话可以通过下标来访问数据. ...

最新文章

  1. 云栖大会发布全球调度算法大赛,阿里又要搞什么黑科技?
  2. python的excel数据分析_excel VS python 谁更适合数据分析?
  3. 唐岩自述奋斗史:从娄底青年到陌陌上市
  4. logrotate管理nginx日志文件
  5. jQuery easyUI--layout布局页面
  6. [转] UML中关联、依赖、聚集等关系的异同
  7. 记录——《C Primer Plus (第五版)》第八章编程练习第二题
  8. Windows Phone开发的十几篇文章(待续)
  9. C语言输入中10A20B,C语言实验报告第3章答案.doc
  10. python mysql扩展_关于python:构建’_mysql’扩展错误:无法找到vcvarsall.bat
  11. Linux下java进程CPU占用率高分析方法
  12. 写出一手烂代码的 19 条准则!
  13. 计算机网络课程设计——校园网的规划与设计
  14. Detours框架实现原理探究
  15. python读写 doc文件和docx文件
  16. css空心图形,css画空心箭头
  17. andriod写计时器
  18. 使用nvm安装node报错,Could not retrieve https://nodejs.org/dist/latest/SHASUMS256.txt. Get “https://nodej
  19. JS原生事件如何绑定
  20. 通过枚举驱动符号链接 判断程序***有几个实例在运行

热门文章

  1. 使用Kotlin开发Android应用 - 环境搭建 (1)
  2. java初学者笔记总结day6
  3. 向ComboBox列表框中添加Enum的全部数据
  4. ASP.NET MVC 5 入门教程 (3) 路由route
  5. Windows Phone 7 开发积累_04
  6. 微信开发 根据openid 获取用户基本信息
  7. 警惕Oracle DB操作高压线
  8. 开机预读快还是不预读快_WIN 7下的超级预读比VISTA要好,改进不少!推荐开启超级预读!...
  9. 什么是计算机网络教学反思,《计算机网络实训之常用的网络工具》教学反思
  10. c语言用for编程图形,C语言编程题求解