跳表和散列表

news2025/1/13 6:06:01

一、跳表

复杂度:O(logn);
跳表的更新:插入数据时,可以选择将这个数据插入到部分索引中,可以选择一个随机函数,产生随机数K,边将索引添加到第一到第K级索引中。
在这里插入图片描述
Redis为何选择跳表来实现有序集合?和红黑树有什么区别?
对于插入、删除、查找两者的复杂度是一样的,但是对于按照区间查找来说,红黑树效率没有跳表高。
对于区间查找,跳表可以做到O(logn)的复杂度来定位起点和终点,然后顺序遍历即可。
跳表实现相对简单、理解容易,也可以改变索引构建策略,平衡执行效率和内存消耗。

二、散列表

散列函数:MD5、SHA、CRC等哈希算法。
散列冲突

  1. 开放寻址法:冲突后重新寻找一个位置,线性探测、二次探测、双重散列(再哈希)。使用装在因子表示剩余空位的多少;
  2. 链表法:散列表(桶、槽)都会对应一条链表,散列值相同的元素放到后面的链表中;
    在这里插入图片描述
    思考题
    1.假设我们有 10 万条 URL 访问日志,如何按照访问次数给 URL 排序?
    2.有两个字符串数组,每个数组大约有 10 万条字符串,如何快速找出两个数组中相同的字符串?
    思路:1.key为URL,value为访问次数,建立散列表。每次put之前先get,如果value存在则,value +=1;不存在则value = 1.
    2.以其中一个字符串数组的每个字符串为key,value为是否出现构建散列表。再遍历第二个字符串数组,以字符串为key在散列表中查找,如果value值为true,则说明存在相同的字符串,时间复杂度O(n)。

如何设计散列函数?
手机号码取后几位为散列值、Word单词拼写检查将每个字母ASCII码值进位相加,再根据散列表大小求余、取模。直接寻址法、平方取中、折叠法、随机数法。

装载因子过大怎么办?
动态扩容,动态扩容需要重新通过散列函数计算数据的存储位置,所以会导致在动态扩容的时候时间复杂度变为O(n),为了避免动态扩容时导致耗时过长,可以选择将扩容后的数据迁移操作分散开,每次插入只迁移部分数据,这样平均下来每次时间复杂度也是O(1)。
在这里插入图片描述
查找时可以在新旧两个散列表中都进行查找。

开放寻址法:要求装载因子上限不能太大,所以比较浪费内存。数据量较小,装载因子小的时候,适合开放寻址法;
链表法:内存利用率高。链表要存储指针,存储较小对象时,比较消耗内存,另外链表中的节点时零散的,对CPU的缓存不友好。可以对链表进行改造为其他高效的数据结构,如跳表、红黑树等。所以链表法比较适合存储大对象,可以支持更多的优化策略。

如何设计一个工业级的散列表?工业级的散列表有哪些特征?

  • 支持快速查找、插入、删除等操作;
  • 内存占用合理、不过多的浪费内存空间;
  • 性能稳定,极端情况下退化不是很严重;

设计思路

  • 设计一个合理的哈希函数;
  • 定义装载因子阈值,病支持动态扩容策略;
  • 选择合适的散列冲突解决方法;

三、散列表和链表的组合使用

LRU缓存淘汰算法
在这里插入图片描述

  • 链表是常规的双向链表有前驱指针、后继指针。另外新增hnext用于做散列表的桶节点。这样可以做到查找和删除、增加操作时间复杂度O(1)。

Redis有序集合
有序集合成员有两个重要属性,key(键值)和score(分值)。所以一般需要根据key查找数据,通过score进行范围查找。
用户ID和积分score,可以按照score从小到大构建一个跳表。这样按照score进行范围查找。另外使用key构建一个散列表,查找成员对象复杂度变成O(1)。

Java LinkedhashMap
LinkedHashMap 是通过双向链表和散列表这两种数据结构组合实现的。LinkedHashMap 中的“Linked”实际上是指的是双向链表,并非指用链表法解决散列冲突。

思考题
假设猎聘网有 10 万名猎头,每个猎头都可以通过做任务(比如发布职位)来积累积分,然后通过积分来下载简历。假设你是猎聘网的一名工程师,如何在内存中存储这 10 万个猎头 ID 和积分信息,让它能够支持这样几个操作:

  • 根据猎头的 ID 快速查找、删除、更新这个猎头的积分信息;
  • 查找积分在某个区间的猎头 ID 列表;
  • 查找按照积分从小到大排名在第 x 位到第 y 位之间的猎头 ID 列表。

按照猎头ID组件散列表,这样按照ID快速查找、删除,另外按照积分进行排序组件跳表,这样可以进行区间和范围查找

四、哈希算法

  1. 哈希值不能推导出原始数据;
  2. 输入数据敏感,只改动一个Bit,得到哈希值也大不相同;
  3. 散列冲突的概率小
  4. 执行效率高,长字符串,也可以快速的计算出哈希值;

哈希函数的应用

  1. 安全加密:MD5、DES、AES(鸽巢原理);
  2. 唯一标识:在海量图库中搜索一张图片。传统方法可以比较图片的二进制字符串。也可以取图片的唯一标识,如从图片的二进制码串头取100字节,从中间取100字节,从最后取100字节计算哈希值进行对比;
  3. 数据校验:电驴BT电影下载,电影文件被分割多个文件块,下载完成之后将多个文件组合,但是网络传输不安全,下载的文件可能被修改过。所以需要下载后进行校验对比,可以将种子文件中的哈希值和下载后的各个文件一一哈希对比;
  4. 散列函数

如何保存用户的密码?
如果只是将用户的密码进行加密后保存,黑客也可以使用字典攻击进行破解。因此需要维护一个常用密码的字典表,将字典中的密码进行哈希计算再哈希,针对字典攻击,可以引入盐(salt),和用户密码组合在一起,增加密码的复杂度。另外除了hash+salt,大多公司采用无论密码长度多少,计算字符串的hash函数时间都固定,进一步减少风险。

区块链的设计思路
区块链每个区块分为两部分:区块头和区块体,区块头保存自己区块体和上一个区块体的哈希值。所以只要任意一个区块被修改过,后面所有区块的哈希值就不对了。

五、哈希算法在分布式系统中的应用

  1. 负载均衡:对客户端IP进行计算哈希值,取得哈希值与服务器链表大小进行取模运算,得到的值就是分到的服务器编号。这样可以不适用映射表。另外客户端的上下线也不用去维护映射表;
  2. 数据分片:1T的日志,统计关键词搜索的次数,将数据进行分片(依次读出每个关键词,通过哈希函数计算哈希值,根据服务器个数n进行取模,分配到对应的机器编号上,这样保证每个关键词都会被分配到一个服务器上)。
  3. 判断图片是否在图库中
  4. 分布式存储:海量数据采用分布式缓存,如果进行服务器扩容那么所有的数据都要进行重新计算哈希值,重新搬移到对应的机器上,这样大量的数据失效,会发生雪崩效应 。这时候就要用到一致性哈希算法

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

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

相关文章

冯·诺依曼体系概括总结

文章目录我们常见的计算机,如笔记本。我们不常见的计算机,如服务器,大部分都遵守冯诺依曼体系。 截至目前,我们所认识的计算机,都是由一个个的硬件组件组成 输入单元:包括键盘, 鼠标,扫描仪, …

Java笔记(JUnit、反射、注解)

一、JUnit单元测试 1. JUnit的介绍 JUnit是一个Java语言的单元测试工具。有了它我们在开发阶段就可以对自己编写的功能模块进行单元测试(就是一块一块去测试),看看是否达到具体预期(这样小Bug我们自己就能解决)。 黑盒…

敏感词检测库ToolGood.Words中 WordsHelper类使用简介

C#开源敏感词检测库ToolGood.Words中的类WordsHelper为文本辅助操作类,支持繁体简体互换、全角半角互换、数字转成中文大写、拼音操作等功能,本文对照参考文献1,对该类的用法进行简要介绍。   WordsHelper类中主要的辅助函数如下表所示&…

基于SVM的航空发动机故障诊断系统设计

目录 第1关:准备实验数据 任务描述: 相关知识: 一、获取数据: 二、读取数据集: 三、如何找出对应的数据列: 编程要求: 测试说明: 第二关:数据预处理 任务描述&…

python习题002--字符串处理

目录 一,题目展示: 二,题目解答 a)判断两个字符串是否相等 b)忽略大小写判断两个字符串是否相等 c,d)判断字符串是否以指定的字符串开始或者是结尾 e) 获取字符串的长度 f) 字符串切片&#xff0c…

认定省级专精特新的条件

之前报省级专精特新的一个条件是先认定市级专精特新,但是打算2023年申报省级专精特新的企业就不需要先申请市级的专精特新了,那是可以直接申请省级专精特新吗?并不是! 接下来打算申请2023年省级专精特新的企业需要先认定山东省创…

18.5.4 分布式恢复

文章目录18.5.4 分布式恢复18.5.4.1 分布式恢复的连接18.5.4.1.1 为分布式恢复端点选择地址18.5.4.1.2 分布式恢复的压缩18.5.4.1.3 用于分布式恢复的复制用户18.5.4.1.4 分布式恢复的 SSL 和身份验证18.5.4.2 分布式恢复的克隆18.5.4.2.1 克隆的先决条件18.5.4.2.2 克隆的阈值…

VsCode配置Kotlin运行环境

目录 需求 前置条件 步骤 问题 一 二 结果 需求 设备上有一个 Android Studio 但是太大了, 于是就想着用 VS Code 配置一个轻量级的,而且 VS Code里面好多插件我用着也比较舒服. 前置条件 Java JDK1.8 或者 11 别的版本没试过 有基于Android Studio 的 Kotlinc的环…

c++ - 第12节 - 模板进阶

1.非类型模板参数 模板参数分为类型形参与非类型形参类型形参(可以认为是虚拟类型):出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参(可以认为是常量):用一个常量作…

带命名空间的arxml读取

一、前言 读取带命名空间的arxml,最好的方式是创建一个字典来存放你自己的前缀并在搜索函数中使用它们: 二、解读如下ns.xml文件: <?xml version"1.0" encoding"UTF-8"?> <AUTOSAR xmlns"http://autosar.org/schema/r4.0" xmlns:xsi…

365天深度学习训练营-第7周:咖啡豆识别

目录 一、前言 二、我的环境 三、代码实现 四、VGG-16框架 五、LeNet5模型 六、模型改进 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/xLjALoOD8HPZcH563En8bQ) 中的学习记录博客** >- **&#x1f366; 参考…

基于STM32G431嵌入式学习笔记——四、LED+KEY+LCD综合练习(基于第12届蓝桥杯显示部分题目)

在学习了前三节LED、LCD、KEY基本操作后&#xff0c;我们就已经成功掌握蓝桥杯必考的三大样内容了&#xff0c;本节以第12届蓝桥杯显示部分内容进行综合练习&#xff1a; 一、真题引入 1.功能概述 2.LCD显示界面 &#xff08;1&#xff09;车位显示界面 &#xff08;2&#…

PostgreSQL数据库缓冲区管理器——本地缓冲区管理

本地缓冲区管理器(local buffer manager)为temporary表&#xff08;无需WAL-logged或checkpointed&#xff09;进行快速缓冲区管理&#xff0c;API定义在src/backend/storage/buffer/localbuf.c中。 获取LocalBuffer 初始化 首先解释temp_buffers GUC参数&#xff0c;其用于…

Servlet学习日志

Hello Web Web World Wide Web 全球广域网->也称为万维网 是一种基于超文本和HTTP协议的分布式应用架构 HTML&#xff08;HyperText Mark-up Language&#xff09;:用于链接网络上的信息 HTTP协议&#xff08;HyperText Transfer Protocol&#xff09;:规定了服务端与客户…

国际海运流程有哪些,国际海运物流哪家比较好

国际海运的优点是运输费划算&#xff0c;并且可以走的货物类目多&#xff0c;合适大物件、大批的长距离运送。进出境运输工具的负责人、进出境物品的所有人或者他们的代理人向海关办理货物、物品或运输工具进出境手续及相关海关事务的过程&#xff0c;包括向海关申报、交验单据…

分析 SpringBoot 底层机制【Tomcat 启动分析 +Spring 容器初始化 +Tomcat 如何关联 Spring 容器 】

目录 一.搭建 SpringBoot 底层机制开发环境 1.pom.xml文件配置 2.springboot主程序MainApp.java 3.启动项目&#xff0c;然后我们准备开始思考 4.开始思考 底层机制分析: 仍然是 我们实现 Spring 容器那一套机制 IO/文件扫描注解反射 集合映射集合映射 二.源码分析: Spri…

DeepLab V2学习笔记

DeepLab V2遇到的相关问题以及解决方法对于DeepLab V1的优化模型总结补充的一个小知识点ASPPLearning rate policy实验结果消融实验实验结果遇到的相关问题以及解决方法 和DeepLab V1中遇到的问题几乎没有什么太大的差别&#xff0c;在文章的引言部分作者提出了在语义分割中遇…

小程序商城拓展中小商户“线上时间”,系统化思维

在数字经济时代初期&#xff0c;新一代信息基础设施建设仍有待完善&#xff0c;在拓展“互联网”应用场景中应不断缩小“数字鸿沟”&#xff0c;逐渐向产业和行业下沉&#xff0c;让互联网巨头和中小微商户共享数字技术的红利&#xff0c;也因此将推动包括传统商户在内的数字化…

政务系统信息网络安全的风险评估

在当今信息时代的大形势下&#xff0c;互联网从普及到飞速发展&#xff0c;政务系统信息网络安全的问题也日益被重视起来。一方面&#xff0c;人们应该了解到政务系统信息网络安全的重要性&#xff1b;另一方面&#xff0c;人们对政务系统信息网络安全风险评估工作有所了解。有…

公厕智能感应皂液盒,无液手机信息提醒

传统式的洗手液一按一压。有时候经常控制不住量&#xff0c;一不小心就容易按多&#xff0c;弄得洗手台乱七八糟&#xff0c;满身也是黏哒哒的&#xff0c;特别让人糟心。刚做完饭&#xff0c;满手油腻&#xff0c;或是刚上完厕所&#xff0c;去按洗手液泵势必会弄脏它。 所以智…