数据结构四——散列表(下)

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

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。
 最后一个操作以后实现,目前做不到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424614.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring学习(2):初始化spring程序

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

Asp.Net Core 第05局:读取配置

前言 本文介绍Asp.Net Core 读取配置文件。环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 前期准备 1.添加app.json文件并在里面添加内容; 2.将app.json文件配置到应用中; 3.添加app.json对应的AppConfig类; 4.下面三种方式读取配置文…

[BUGKU][CTF][PWN][2020] PWN writeup

准备UBUNTU pwndbg pwntools PWN1 关键字:nc 知识点:nc使用方法 https://www.cnblogs.com/nmap/p/6148306.html nc命令是一个功能打包的网络实用程序,它通过命令行在网络上读取和写入数据;nc是为NMAP项目编写的,是目前已分裂的ne…

spring学习(3):获取bean对象

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

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

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 1散列表的由来 从数组随机访问特性说起。  数组的随机访问特性是:数组a,a[5]可以直接访问到数组的第6个元素。这就类似于在下标和数组对应的值之间建立…

java实训 :异常(try-catch执行顺序与自定义异常)

关键字:try:执行可能产生异常的代码catch:捕获异常finally:无论是否发生异常代码总能执行throws:声明方法可能要抛出的各种异常throw:手动抛出自定义异常用 try-catch-finally 异常处理:情况一(正常运行,无异常):执行try,执行fina…

[BUGKU][CTF][Reverse][2020] Reverse writeup 1-7 暂时肝不动了

Reverse 入门逆向 步骤: ida main函数 按R Reverse signin 关键字: 知识点:Android逆向分析。(常用工具:安卓模拟器、JEB、Cyberchef、Androidkiller) 步骤: 1.用jeb打开,找到MainActivity,右…

spring学习(4):spring管理对象之间的关联关系

接着上一节的课程继续学习 MesasageService 类 package hello;import org.springframework.stereotype.Component; //注解的加入 Component public class MesasageService {public MesasageService() {super();System.out.println("MessageService...");}/*** 执行打…

算法三——递归

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。   递归是非常常用的编程技巧。但是学习过程中往往很容易递出去,却归不回来。 1生活中的例子理解递归 在电影院里面如果你想知道自己在第几排坐着。电影…

[Lua]LuaAPI整理

ref :https://blog.csdn.net/ouyangshima/article/details/43339571 LUA和C/C的沟通桥梁——栈 Lua生来就是为了和C交互的,因此使用C扩展Lua或者将Lua嵌入到C当中都是非常流行的做法。要想理解C和Lua的交互方式,首先要回顾一下C语言是如何处理…

[hackinglab][CTF][基础关][2020] hackinglab 基础关 writeup

在线工具:https://www.qqxiuzi.cn/daohang.htm 基础关 1 key在哪里? 知识点:F12查看源代码 步骤:F12 基础关 2 再加密一次你就得到key啦~ 知识点:ROT13 步骤: 基础关 3 猜猜这是经过了多少次加密? 关键字&#xf…

spring学习(5):spring简介

1什么是spring 核心概念 spring框架组成

算法四——哈希

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 哈希算法的定义 文章来自极客时间。 参考网页 定义:将任意长度的二进制值串映射为固定长度的二进制值串。映射之后的二进制值串称为哈希值。 符合几点要…

《Java并发编程的艺术》之阻塞队列

阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法: 1) 支持阻塞的插入方法:当队列满时,队列会阻塞执行插入的线程 2) 支持阻塞的移除方法:当队列空时,队列会阻塞执行移除的线程 方法总…

spring学习(6):使用xml方式实现spring基本应用

接着上一节的课程继续学习 在resources文件下建立applicationconText applicationconText.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3…

[burp][CTF]burp intruder爆破出现 Payload set 1: Invalid number settings的解决办法

这是一个软件bug 如果点击start attrack 后出现 Payload set 1: Invalid number settings 的提示&#xff0c;先点hex 后点 decimal 再开始start attrack&#xff0c;需要手动让它刷新。

数据结构五——二叉树

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 树 1.1 概念 概念&#xff1a;树、根、父节点、子节点、叶子节点。 几个度&#xff1a;高度、深度、层。与实际生活中的这几个概念类比。 高度&#xff1a;从下往…

spring学习(7):加入log4g日志系统

点击show dependencies popup 修改pom.xml文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&quo…

[hackinglab][CTF][脚本关][2020] hackinglab 脚本关 writeup

脚本关 1 key又又找不到了 关键字&#xff1a; 知识点&#xff1a; 步骤:点击提供的链接后&#xff0c;实际发生了两次跳转&#xff0c;key 在第一次跳转的网页中&#xff0c;key is : yougotit_script_now 脚本关 2 快速口算 关键字&#xff1a; 知识点&#xff1a;python基…

plsql 记录型变量

set serveroutput ondeclareemplist emp%rowtype;beginselect * into emplist from emp where empno7839; dbms_output.put_line(emplist.ename||的薪水是||emplist.sal); end; / 转载于:https://www.cnblogs.com/wangchuanfu/p/10963851.html