左神算法基础提升--1

文章目录

  • 哈希函数
    • 哈希函数的主要特点
      • 确定性
      • 快速计算
      • 输出长度固定
      • 离散性
  • 哈希表
    • 哈希表的原理
    • 解题
  • 布隆过滤器
    • 布隆过滤器的主要特点
      • 高效性
      • 快速查询
      • 空间效率
      • 误报率
    • 布隆过滤器的原理
  • 一致性哈希
    • 一致性哈希原理
    • 一致性哈希应用


哈希函数

`哈希函数是一种将任意长度的输入(又称为预映射),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,即散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而这种映射通常是不可逆的。

哈希函数的主要特点

确定性

对于同一个输入值,哈希函数在每次执行时都会产生相同的哈希值。例如,假设有一个哈希函数H,输入字符串“hello”,每次计算得到的哈希值都是固定的一个值,比如“348920349234”。这种确定性使得哈希函数可以用于数据校验等场景,只要输入不变,就可以通过比较哈希值来判断数据是否被篡改。

快速计算

能够快速计算出输入值的哈希值。在很多应用中,如数据库索引、文件系统等,需要频繁地对大量数据进行哈希计算。如果哈希函数计算速度很慢,就会严重影响系统的性能。例如,在一个大规模的分布式存储系统中,当需要对海量文件进行索引时,快速计算文件内容的哈希值可以加快索引构建的速度。

输出长度固定

不管输入数据的长度如何,哈希函数产生的输出长度是固定的。例如,MD5哈希函数的输出长度总是128位(16字节)。这意味着无论输入是一个字节还是一个TB(太字节)的数据,输出都是长度相同的一串二进制数。这种固定长度的输出便于存储和比较,例如在一些安全协议中,固定长度的哈希值可以方便地在网络中传输和进行安全校验。

离散性

哈希函数的离散性是指输出的哈希值在值域内是均匀分布的,即不同的输入值通过哈希函数映射后,得到的哈希值在哈希空间中是随机且均匀散布的。这一特性对于哈希函数的性能和应用至关重要。

哈希表

哈希表的原理

哈希表是通过链表,哈希函数,数组的共同作用下形成的。
一个字符串通过哈希函数计算得到一个哈希值,将哈希值模上规定的数组的长度,将字符串连同得到的哈希值包装起来,如果模完得到的结果在数组中已存在节点,便将包装后的结果用链表的方式串联在原本节点之后,如果没有便直接放在数组的对应位置,这样便得到了一个哈希表。由于哈希函数的离散性,数据种类一多最终得到的结果便是分布均匀的,为了避免链表过长,在链表的长度达到某个阈值时,便会对数组进行扩容。由哈希函数的原理可知,查找哈希函数中的某个字符串时,尽管其常数时间会很大但其时间复杂度为O(1)。在这里插入图片描述

解题

在这里插入图片描述
在求解这道题中,我们需要用到两个哈希表,第一个哈希表存储值与其对应的下标,第二个哈希表存储下标与其对应的值。
在这里插入图片描述

在这里插入图片描述
在insert时,我们先查询map1,如果map1中并不存在要插入的key,我们便可以按照上述规则进行插入,由于哈希表的时间复杂度为O(1),则该结构的插入操作也是O(1)的时间复杂度。
在这里插入图片描述

在getrandom时,我们只需要用一个random函数在0-size这个范围内得到一个随机的数,之后在map2哈希表中查找并返回就可以了。
在这里插入图片描述

在delete时,由于需要维护这个连续性,会麻烦一点,在删除操作中,我们需要将map1中最后一个字段对应的下标先修改为和要删除的字段对应的下标一致,之后删除map1的最后一个要删除的数。在map2中,我们先从map1中查询出要删除的下标,并在map2中得到最后一个下标对应的key,将map2中对应下标的值修改为最后一个下标对应的key,并将最后一个字段删除。在这里插入图片描述
完整代码
在这里插入图片描述

布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率很高的概率型数据结构,由Burton Howard Bloom在1970年提出,它用于判断一个元素是否在一个集合中。

布隆过滤器的主要特点

高效性

布隆过滤器使用多个哈希函数和位数组来存储数据,占用的内存空间远小于存储实际集合所需的空间。

快速查询

可以在常数时间内完成对元素的查找,即查询速度非常快。

空间效率

由于其概率性质,布隆过滤器可以在非常小的空间内存储大量数据。

误报率

布隆过滤器可能会有误报,即可能会错误地认为某个元素存在于集合中,但不会漏报(即如果元素真的存在于集合中,布隆过滤器一定不会说它不存在)。布隆过滤器不能从集合中删除元素,因为删除操作可能会影响其他元素的判断结果。

布隆过滤器的原理

布隆过滤器本质上是一个位图。其原理为:将一个字段用k个哈希函数计算得到k个值,将这些值分别模上布隆过滤器的长度m,将布隆过滤器对应位置涂黑便代表这个字段已经加入到布隆过滤器的黑名单中。那如何判断一个字段是否在黑名单中呢,我们可以使用相同的方法对字段进行计算得到k个位置,只有当这k个字段均黑时,才代表该字段在黑名单中。
那如何选择m和k的个数呢?由前文的原理可知,当m变大时,失误率在逐渐减少的;当k值变大时,由于一开始每个字段的信息够多,所以失误率在逐渐降低,但当k值到达一个阈值时,k值变大会导致每个字段所描黑的位置更多导致失误率反而上升了。
在这里插入图片描述
由此我们可以得出计算合适k值与m值的三个公式
在这里插入图片描述

一致性哈希

一致性哈希原理

在一致性哈希中,哈希函数的输出(通常是整数)被想象成一个固定大小的圆环,这个圆环被称为哈希环。哈希值在这个环上均匀分布,每个服务器(或缓存节点)在这个环上都有一个或多个位置(即哈希值)。数据(如缓存项或请求)通过哈希函数映射到环上的某个位置,然后按照顺时针方向被路由到第一个遇到的服务器。

一致性哈希应用

在实际应用中,为了提高哈希环的利用率和负载均衡,通常会在哈希环上为每个服务器分配多个虚拟节点(或称为虚拟服务器)。这些虚拟节点均匀分布在哈希环上,数据项首先映射到这些虚拟节点,然后再由虚拟节点路由到实际的物理服务器。
例如,如果有三个服务器,可以在哈希环上为每个服务器分配三个虚拟节点,这样总共有9个虚拟节点分布在环上。当一个数据项通过哈希函数映射到环上时,它会被路由到顺时针方向遇到的第一个虚拟节点,该虚拟节点对应的物理服务器就负责处理这个数据项。
通过这种方式,即使服务器数量发生变化,也只需要调整部分虚拟节点的位置,从而减少了数据迁移的需要,提高了系统的稳定性和扩展性。

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

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

相关文章

【Go】Go Gin框架初识(一)

1. 什么是Gin框架 Gin框架:是一个由 Golang 语言开发的 web 框架,能够极大提高开发 web 应用的效率! 1.1 什么是web框架 web框架体系图(前后端不分离)如下图所示: 从上图中我们可以发现一个Web框架最重要…

VS Code 的扩展下载安装的最新方式

离线包的下载 在 2024年的时候,在VS Code的官方扩展市场:https://marketplace.visualstudio.com/ , 搜索到需要的扩展之后,是可以在对应的页面现在最新版本和几个历史版本的扩展的安装包。 下载下来的扩展包的文件是后缀是 vsix …

【Vue3 入门到实战】3. ref 和 reactive区别和适用场景

目录 ​编辑 1. ref 部分 1.1 ref定义基本数据类型 1.2 ref 定义引用数据类型 2. reactive 函数 3. ref 和 reactive 对比 3.1 原理 3.2 区别 3.3 使用原则 在 Vue 3 中 ref 和 reactive 是用于创建响应式数据的两个核心函数。它们都属于 Composition API 的一部分&…

浅谈云计算07 | 云安全机制

云计算安全机制 一、引言二、加密技术:数据的隐形护盾三、散列机制:数据完整性的忠诚卫士四、数字签名:数据来源与真伪的鉴定专家五、公钥基础设施(PKI):信任的基石六、身份与访问管理(IAM&…

【Sql递归查询】Mysql、Oracle、SQL Server、PostgreSQL 实现递归查询的区别与案例(详解)

文章目录 Mysql 5.7 递归查询Mysql 8 实现递归查询Oracle递归示例SQL Server 递归查询示例PostgreSQL 递归查询示例 更多相关内容可查看 Mysql 5.7 递归查询 MySQL 5.7 本身不直接支持标准 SQL 中的递归查询语法(如 WITH RECURSIVE 这种常见的递归查询方式&#xf…

【Unity3D】【已解决】TextMeshPro无法显示中文的解决方法

TextMeshPro无法显示中文的解决方法 现象解决方法Assets 目录中新建一个字体文件夹在C:\Windows\Fonts 中随便找一个中文字体的字体文件把字体文件拖到第一步创建的文件夹中右键导入的字体,Create---TextMeshPro---Font Asset,创建字体文件资源把 SDF文件…

ShaderJoy —— 如何判别直线是否和二次贝塞尔曲线相交【GLSL】

效果图 关键代码解析 bool IntersectsQuadraticBezier (vec2 src, vec2 dest) {float A = (CONTROL_POINT_A - 2.0 * CONTROL_POINT_B

第十二章:算法与程序设计

文章目录: 一:基本概念 1.算法与程序 1.1 算法 1.2 程序 2.编译预处理 3.面向对象技术 4.程序设计方法 5.SOP标志作业流程 6.工具 6.1 自然语言 6.2 流程图 6.3 N/S图 6.4 伪代码 6.5 计算机语言 二:程序设计 基础 1.常数 …

【BLE】CC2541之ADC

本文最后修改时间:2022年04月12日 23:00 一、本节简介 本文介绍如何通过P05口采集电压值。 二、实验平台 1)CC2541平台 ①协议栈版本:BLE-CC254x-1.4.0 ②编译软件:IAR 10.20.1 ③硬件平台:香瓜CC2541开发板、USB…

SpeingMVC框架(三)

目录 五、响应数据与结果视图 1、返回值分类 2、springmvc的请求转发和重定向 六、异常处理 1、处理思路 2、自定义异常处理器 七、springmvc中的拦截器 1、拦截器概述 2、自定义拦截器步骤 五、响应数据与结果视图 1、返回值分类 返回String:Controller方…

Hadoop3.x 万字解析,从入门到剖析源码

💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接:https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码:ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…

汽车免拆诊断案例 | 2007 款法拉利 599 GTB 车发动机故障灯异常点亮

故障现象  一辆2007款法拉利599 GTB车,搭载6.0 L V12自然吸气发动机(图1),累计行驶里程约为6万km。该车因发动机故障灯异常点亮进厂检修。 图1 发动机的布置 故障诊断 接车后试车,发动机怠速轻微抖动,…

Emacs 折腾日记(九)——elisp 数组与序列

elisp 中序列是数组和列表的统称,序列的共性是内部数据有一个先后的顺序,它与C/C 中有序列表类似。 elisp 中的数组包括向量、字符串、char-table 和布尔向量,它们的关系如下: 在之前一章中已经介绍了序列中的一种类型——列表&#xff0c…

Mac玩Steam游戏秘籍!

Mac玩Steam游戏秘籍! 大家好!最近有不少朋友在用MacBook玩Steam游戏时遇到不支持mac的问题。别担心,我来教你如何用第三方工具Crossover来畅玩这些不支持的游戏,简单又实用! 第一步:下载Crossover 首先&…

初识算法和数据结构P1:保姆级图文详解

文章目录 前言1、算法例子1.1、查字典(二分查找算法)1.2、整理扑克(插入排序算法)1.3、货币找零(贪心算法) 2、算法与数据结构2.1、算法定义2.2、数据结构定义2.3、数据结构与算法的关系2.4、独立于编程语言…

Oracle 使用dbms_stats.gather_table_stats来进行表analyse,收集表统计信息

目录 一. 介绍二. 参数说明三. 简易封装四. 效果 一. 介绍 DBMS_STATS.GATHER_TABLE_STATS 用于收集 表 级别的统计信息。这些统计信息有助于查询优化器优化查询计划,影响与表本身相关的查询性能。 Oracle 查询优化器会根据表的统计信息来选择最优的执行计划。当运…

apache-skywalking-apm-10.1.0使用

apache-skywalking-apm-10.1.0使用 本文主要介绍如何使用apache-skywalking-apm-10.1.0,同时配合elasticsearch-8.17.0-windows-x86_64来作为存储 es持久化数据使用。 步骤如下: 一、下载elasticsearch-8.17.0-windows-x86_64 1、下载ES(elasticsear…

Flink系统知识讲解之:容错与State状态管理

Flink系统知识之:容错与State状态管理 状态在Flink中叫作State,用来保存中间计算结果或者缓存数据。根据是否需要保存中间结果,分为无状态计算和有状态计算。对于流计算而言,事件持续不断地产生,如果每次计算都是相互…

Python线性混合效应回归LMER分析大鼠幼崽体重数据、假设检验可视化|数据分享...

全文链接:https://tecdat.cn/?p38816 在数据分析领域,当数据呈现出层次结构时,传统的一般线性模型(GLM)可能无法充分捕捉数据的特征。混合效应回归作为GLM的扩展,能够有效处理这类具有层次结构的数据&…