当前位置: 首页 > news >正文

Java与查找算法(5):哈希查找

一、哈希查找

哈希查找,也称为散列查找,是一种基于哈希表的查找算法。哈希表是一种数据结构,它将键(key)映射到值(value),使得查找某个键对应的值的时间复杂度为O(1)。哈希查找的过程就是将要查找的键通过哈希函数转换成哈希表中的索引,然后在索引对应的位置上查找值。因为哈希函数的映射是唯一的,所以哈希表中不会出现键冲突的情况。

哈希函数通常是将键映射成一个整数,然后再将这个整数映射到哈希表中的索引。理想情况下,哈希函数应该满足以下几个条件:

  1. 哈希函数应该是确定性的,即对于相同的键,哈希函数应该总是返回相同的结果。
  2. 哈希函数应该将键均匀地映射到哈希表中的索引,以避免出现哈希冲突。
  3. 哈希函数的计算速度应该足够快,以保证哈希查找的效率。

在实际应用中,哈希函数的设计往往需要考虑到具体的应用场景和数据特点,需要根据实际情况进行调整。

哈希查找的优点是查找效率高,时间复杂度为O(1),但其缺点是空间利用率低,因为哈希表需要预先分配一定的空间。另外,哈希函数的设计也可能会影响哈希查找的效率和准确性。因此,在实际应用中,需要根据具体情况选择合适的哈希函数和哈希表大小,以达到最优的查找效果。

二、哈希查找的性质

哈希查找具有以下性质:

  1. 哈希函数的映射是唯一的,即对于相同的键,哈希函数总是返回相同的哈希值。
  2. 哈希表的大小是固定的,一旦分配了空间,就不能再改变大小。
  3. 哈希表中的每个位置都对应着一个桶,每个桶中可以存储多个键值对。
  4. 哈希冲突是不可避免的,因此需要解决哈希冲突的方法,如链式哈希和开放地址哈希等。
  5. 哈希查找的时间复杂度为O(1),但是最坏情况下的时间复杂度为O(n),其中n是键值对的数量。
  6. 哈希表的空间利用率通常较低,因为需要预先分配一定的空间,而且哈希冲突会导致某些位置存储的键值对较多,而其他位置则较少。
  7. 哈希查找适用于查找频繁、数据量较大的场景,但不适用于需要排序和遍历的场景。

三、哈希查找的变种

哈希查找有许多变种,其中比较常见的有以下几种:

  1. 链式哈希:链式哈希是一种解决哈希冲突的方法,它将哈希表中的每个位置看作一个桶,每个桶中存储一个链表,链表中存储哈希值相同的键值对。当发生哈希冲突时,新的键值对会被添加到对应桶的链表中。

  2. 开放地址哈希:开放地址哈希也是一种解决哈希冲突的方法,它将哈希表中的每个位置看作一个桶,每个桶中最多存储一个键值对。当发生哈希冲突时,会根据一定的规则(如线性探测、二次探测等)在哈希表中查找下一个可用的位置,并将新的键值对存储在该位置上。

  3. 完全哈希:完全哈希是一种针对哈希表中键值对数量较少的情况下的优化方法,它利用哈希函数的性质将哈希表中的每个位置都映射到一个小的、固定的哈希表中。这样可以减少哈希冲突的概率,提高查找效率。

  4. 一致性哈希:一致性哈希是一种分布式系统中常用的哈希算法,它通过哈希函数将键映射到一个环形空间中,并将每个节点映射到环上的一个位置。当需要查找某个键时,可以根据哈希函数计算出键在环上的位置,并根据一定的规则(如顺时针查找最近的节点)找到对应的节点。这样可以实现负载均衡和故障恢复等功能。

四、Java 实现

在 Java 中,可以使用 HashMap 类来实现哈希查找。HashMap 是基于哈希表实现的,可以将键映射到值,具有快速的查找、插入和删除操作。

下面是一个简单的示例代码:

import java.util.HashMap;public class HashSearch {public static void main(String[] args) {HashMap<String, Integer> map = new HashMap<>();map.put("apple", 1);map.put("banana", 2);map.put("orange", 3);map.put("grape", 4);int value = map.get("apple");System.out.println("The value of apple is " + value);boolean containsKey = map.containsKey("banana");System.out.println("The map contains banana: " + containsKey);map.remove("orange");System.out.println("After removing orange, the map contains: " + map);}
}

输出结果为:

The value of apple is 1
The map contains banana: true
After removing orange, the map contains: {grape=4, apple=1, banana=2}

在这个示例中,我们创建了一个 HashMap 对象,将字符串键映射到整数值。然后,我们使用 get() 方法获取键为 “apple” 的值,使用 containsKey() 方法检查键为 “banana” 是否存在,使用 remove() 方法删除键为 “orange” 的键值对。最后,我们打印出修改后的 HashMap 对象。

五、哈希查找的应用场景

哈希查找适用于以下场景:

  1. 频繁的查找操作:哈希查找的时间复杂度为O(1),因此适用于需要频繁进行查找操作的场景。

  2. 大规模数据的查找:哈希查找的效率不会随着数据量的增加而降低,因此适用于大规模数据的查找场景。

  3. 数据库索引:数据库中的索引通常使用哈希表实现,以加快查找速度。

  4. 缓存系统:缓存系统通常使用哈希表来存储缓存数据,以提高数据的访问速度。

  5. 路由表:路由表通常使用哈希表来存储路由信息,以加快路由查找速度。

  6. 字典数据结构:哈希表可以用来实现字典数据结构,以支持快速的查找、插入和删除操作。

总之,哈希查找适用于需要快速查找大量数据的场景,但不适用于需要排序和遍历的场景。在实际应用中,需要根据具体情况选择合适的哈希函数和哈希表大小,以达到最优的查找效果。

六、哈希查找在spring 中的应用

在 Spring 中,哈希查找通常应用于缓存系统和路由表等场景。

  1. 缓存系统:Spring 提供了多种缓存实现,其中包括基于哈希表的缓存实现。通过使用 @Cacheable 和 @CacheEvict 注解,可以将方法的返回值缓存到指定的缓存中,并在需要时从缓存中获取数据,以提高系统的性能和响应速度。

  2. 路由表:Spring Cloud Gateway 是一个基于 Spring Boot 和 Spring Cloud 的网关服务,它使用哈希表来存储路由信息,并根据请求的路径和参数等信息进行哈希查找,以确定请求应该被路由到哪个服务实例。

除此之外,Spring 还提供了基于 Redis 和 Ehcache 等其他缓存实现,这些实现也使用了哈希表来提高缓存的查找速度。在实际应用中,需要根据具体的业务需求和系统架构选择合适的缓存实现和哈希函数,以达到最优的性能和可扩展性。

相关文章:

Java与查找算法(5):哈希查找

一、哈希查找 哈希查找&#xff0c;也称为散列查找&#xff0c;是一种基于哈希表的查找算法。哈希表是一种数据结构&#xff0c;它将键&#xff08;key&#xff09;映射到值&#xff08;value&#xff09;&#xff0c;使得查找某个键对应的值的时间复杂度为O(1)。哈希查找的过…...

Vercel部署个人博客

vercel 部署静态资源网站极其方便简单&#xff0c;并且有可观的访问速度&#xff0c;最主要的是免费部署。 如果你还没有尝试的话&#xff0c;强烈建议去使用一下。 演示博客演示http://202271.xyz/?vercel vercel 介绍 注册账号 进入Vercel官网https://vercel.com&#x…...

【论文阅读】An Object SLAM Framework for Association, Mapping, and High-Level Tasks

一、系统概述 这篇文章是一个十分完整的物体级SLAM框架&#xff0c;偏重于建图及高层应用&#xff0c;在前端的部分使用了ORBSLAM作为基础框架&#xff0c;用于提供点云以及相机的位姿&#xff0c;需要注意的是&#xff0c;这篇文章使用的是相机&#xff0c;虽然用的是点云这个…...

《metasploit渗透测试魔鬼训练营》学习笔记第六章--客户端渗透

四.客户端攻击 客户端攻击与服务端攻击有个显著不同的标识&#xff0c;就是攻击者向用户主机发送的恶意数据不会直接导致用户系统中的服务进程溢出&#xff0c;而是需要结合一些社会工程学技巧&#xff0c;诱使客户端用户去访问这些恶意数据&#xff0c;间接发生攻击。 4.1客户…...

华为OD机试真题 Java 实现【Linux 发行版的数量】【2023Q1 100分】

一、题目描述 Linux 操作系统有多个发行版,distrowatch.com 提供了各个发行版的资料。这些发行版互相存在关联,例如 Ubuntu 基于 Debian 只开发而 Mint 又基于 Ubuntu 开发,那么我们认为 Mint 同 Debian 也存在关联。 发行版集是一个或多个相关存在关联的操作系统发行版,…...

VMware ESXi 8.0U1a macOS Unlocker OEM BIOS (标准版和厂商定制版)

VMware ESXi 8.0 Update 1a macOS Unlocker & OEM BIOS (标准版和厂商定制版) ESXi 8.0U1 标准版&#xff0c;Dell HPE 联想 浪潮 定制版 请访问原文链接&#xff1a; https://sysin.org/blog/vmware-esxi-8-u1-oem/&#xff0c;查看最新版。原创作品&#xff0c;转载请保…...

Effective STL_读书笔记

Effective STL 1. 容器条例01&#xff1a;慎重选择容器类型条例02&#xff1a;不要试图编写独立于容器类型的代码条例03&#xff1a;确保容器中对象的拷贝正确而高效条例04&#xff1a;调用empty而不是检查size()是否为空条例05&#xff1a;区间成员函数优先于与之对应的单元素…...

通过yum:mysql5.6-msyql5.7-mysql8.0升级之路

一 前言 mysql的yum源 https://dev.mysql.com/downloads/repo/yum/ https://dev.mysql.com/get/mysq57-community-release-el7-7.noarch.rpm服务器信息 2c2g40GB [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [rootlocalhost ~]# una…...

C语言数据存储 — 整型篇

C语言数据存储 — 整型篇 前言1. 数据类型介绍1.1 类型的基本分类 2. 整型在内存中的存储2.1 原码、反码、补码2.1.1 为什么数据存放在内存中存放的是补码 2.2 大小端介绍2.2.1 什么是大小端&#xff1f;2.2.2 为什么有大端和小端&#xff1f;2.2.3 一道百度系统工程师笔试题 3…...

高级Excel功能教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 Excel是办公室自动化中非常重要的一款软件&#xff0c;Excel函数则是Excel中的内置函数。Excel函数共包含11类&#xff0c;分别是数据库函数、日期与时间函数、工程函数、财务函数、信息函数、逻辑函数、查询和引用函数、数学和三角函数、统计函数、文本函数以及用户…...

ChatGPT会取代低代码开发平台吗?

编程作为一种高端技能&#xff0c;向来是高收入高科技的代名词。近期&#xff0c;伴随着ChatGPT在全球的爆火&#xff0c;过去通过窗口“拖拉拽”的所见即所得方式的低代码开发模式&#xff0c;在更加智能和更低成本的AI搅局之下&#xff0c;又面临了更深层次的影响。 低代码平…...

Linux :: 文件内容操作【5】:echo 指令 与 输入重定向、输出重定向、追加重定向在文件内容写入中的简单用法!

前言&#xff1a;本篇是 Linux 基本操作篇章的内容&#xff01; 笔者使用的环境是基于腾讯云服务器&#xff1a;CentOS 7.6 64bit。 学习集&#xff1a; C 入门到入土&#xff01;&#xff01;&#xff01;学习合集Linux 从命令到网络再到内核&#xff01;学习合集 说明&#x…...

【RocketMQ】重试机制及死信消息处理

【RocketMQ】重试机制及死信消息处理 文章目录 【RocketMQ】重试机制及死信消息处理1. 重试机制1.1 生产者重试1.2 消费者重试1.2.1 死信队列 参考文档&#xff1a; 官方文档 1. 重试机制 1.1 生产者重试 rocketmq生产者发送消息失败默认重试2次(同步发送为2次&#xff0c;异…...

Mysql DDL执行方式-pt-osc介绍 | 京东云技术团队

1 引言 大家好&#xff0c;接着上次和大家一起学习了《MySQL DDL执行方式-Online DDL介绍》&#xff0c;那么今天接着和大家一起学习另一种MySQL DDL执行方式之pt-soc。 在MySQL使用过程中&#xff0c;根据业务的需求对表结构进行变更是个普遍的运维操作&#xff0c;这些称为…...

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…...

在 Git 中撤消更改的 6 种方法!

目录 1. 修改最近的提交 2. 将分支重置为较旧的提交 硬重置 软重置分支 创建备份分支 3. 交互式变基 删除旧提交 改写提交消息 编辑旧提交 压缩 4. 还原提交 5. 签出文件 6. 使用 Git Reflog 当使用 Git 进行项目代码管理时&#xff0c;难免会出现一些错误操作或需…...

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置

LiveGBS国标GB/T28181国标平台功能-电子地图移动位置订阅mobileposition地图定位GPS轨迹坐标位置获取redis获取位置 1、位置订阅1.1、国标设备编辑1.2、选择设备开启位置订阅1.3、全局开启位置订阅1.4、通过目录订阅获取位置(少数情况) 2、经纬度信息查询2.1、访问接口获取2.1.…...

编程(38)----------计算机的部分原理

本篇主要总结一些计算机的理论部分. 计算机在发展历程中,无论是最早的巨无霸机器,还是现在小到可以拿在手中的掌机.只要其本质上是计算机,在最基础的结构上,都是以冯诺依曼体系所构建的. 冯诺依曼体系大致将计算机分为几个最重要的部分:输入,输出,中央处理器,存储设备.也就是…...

若依框架快速搭建(二)

目录 数据库设计功能模块设计XXX信息管理xxx查询xxx添加xxx删除xxx修改xxx导出 功能模块实现运行数据库自动代码生成在IDEA中找到RuoYi-generator&#xff0c;修改配置运行前后端项目&#xff0c;在网页中找到代码生成模块导入表后点击确定&#xff0c;序号前打勾&#xff0c;再…...

为建筑物的供暖系统实施MPC控制器的小型项目(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...