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

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

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个元素。这就类似于在下标和数组对应的值之间建立…

[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...");}/*** 执行打…

[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框架组成

算法四——哈希

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

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基…

用递归树求解递归算法时间复杂度

文章内容、图片均来自极客时间。 递归代码复杂度分析起来比较麻烦。一般来说有两种分析方法&#xff1a;递推公式和递归树。 1 递推公式法 归并排序的递推公式是&#xff1a; merge_sort(p…r) merge(merge_sort(p…q), merge_sort(q1…r)) 终止条件&#xff1a; p > r …

spring学习(8):log4j.properties 详解与配置步骤

一、入门实例 1.新建一个JAva工程&#xff0c;导入包log4j-1.2.17.jar&#xff0c;整个工程最终目录如下 2、src同级创建并设置log4j.properties ### 设置### log4j.rootLogger debug,stdout,D,E### 输出信息到控制抬 ### log4j.appender.stdout org.apache.log4j.ConsoleAp…

[hackinglab][CTF][注入关][2020] hackinglab 注入关 writeup

服务器挂了 咕咕咕 参考链接&#xff1a;https://blog.csdn.net/weixin_41924764/article/details/107095963?utm_mediumdistribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.control&depth_1-utm_sourcedistribute.pc_relevant_t0.none-task-bl…

数据结构六——堆

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 1 堆定义 1.1 定义和结构 堆是一个完全二叉树&#xff08;完全二叉树&#xff1a;除了叶子节点外每一层节点都是满的&#xff0c;最后一层的子节点都靠左排列&…