【基础算法】哈希表(开放寻址法)

简介: 【基础算法】哈希表(开放寻址法)
🌹作者:云小逸
📝个人主页: 云小逸的主页
📝Github: 云小逸的Github
🤟motto:要敢于一个人默默的面对自己, ==强大自己才是核心==。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在!学会自己和解,与过去和解,努力爱自己。==希望春天来之前,我们一起面朝大海,春暖花开!==🤟
👏专栏:C++👏 👏专栏:Java语言👏👏专栏:Linux学习👏
👏专栏:C语言初阶👏👏专栏:数据结构👏👏专栏:备战蓝桥杯👏

前言

今天这篇文章接着上一篇文章【哈希表(拉链法)】继续说解决哈希表冲突的第二种方法:开放寻址法。
——————————————————————————————

首先先写上几句话:献给坚持创作的我和点开这篇文章希望进步的你
1. 世界上最厉害的人,是说起床就起床,说睡觉就睡觉,说做事就做事,说玩就玩,说收心就收心,说不爱 就不爱。

2.一定要狠下心来努力变成一个很厉害的人,厉害到有一天,你可以随时离开那些令你不舒服的圈子和人, 让他们通通羡慕不已。

3.努力变得更厉害的原因是,以后遇到喜欢的人,除了真心,还有其他东西可以拿得出手。

4.我以为别人尊重我,是因为我很优秀。慢慢的我明白了,别人尊重我,是因为别人很优秀;优秀的人更懂 得尊重别人。对人恭敬其实是在庄严你自己。

5. 五粮液从不骂茅台,茅台也从不诋毁五粮液。双双成为世界名酒。人活着发自己的光就行,没必要灭别人 的灯。

例题: 模拟散列表

题目:

维护一个集合,支持如下几种操作:
I x,插入一个数 x;
Q x,询问数 x 是否在集合中出现过;
现在要进行 N 次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。

输出格式

对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。
每个结果占一行。

数据范围

1≤N≤105
−109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

开放寻址法:

核心思想:

与拉链法类似,要先建立一个哈希函数,将原数组映射到哈希函数上,
与拉链法相比,开放寻址法只需要建立一个数组,不用像拉链法那样再设置一个链表。
在这里插入图片描述
这里可以想象一下我们去上厕所的情景,先从k的位置【k是该数在哈希函数的映射值】开始看是否有人,有人就下一个坑位,没人就占这个位置。

添加:

从k的位置开始找,看这个坑位是否有人,有人就下一个

查找:

从第k的坑位开始查找:
当前坑位有人,是x,则查找到了。
当前坑位有人,但不是x,则下一个。
当前坑位没有人,说明x不存在。

删除:

按照查找的方式,如果找到x,一般不会将x删掉,只是打一个特殊的标志,以示删除掉了x,这个与拉链法类似。

代码:

#include <cstring>
#include <iostream>

using namespace std;

const int N = 200003;//题目要求N的范围是[0,10^5],但从经验上一维数组的长度要开到要求的2-3倍。
                     //这样就可以最大程度地降低冲突的概率,那么N取大于范围的第一个质数。
const int null = 0x3f3f3f3f;//设置一个数表示这个坑位没有人,即设定数组的初始化的值,
                            //且这个要在N的范围之外。

int h[N];

int find(int x)
{
    int t = (x % N + N) % N;
    while (h[t] != null && h[t] != x)//表示坑位不为0,且坑位内不是查找的值
    {
        t ++ ;//看下一个坑位
        if (t == N) t = 0;//看完了最后的坑位,要返回到第一个坑位,循环回来看第一个坑位i
    }
    return t;//两种含义:k在哈希表中,返回k在哈希表的下标,如果不在哈希表中,则返回x应该存在哈希表的位置
}

int main()
{
    memset(h, 0x3f, sizeof h);

    int n;
    scanf("%d", &n);

    while (n -- )
    {
        char op[2];
        int x;
        scanf("%s%d", op, &x);
        if (*op == 'I') h[find(x)] = x;
        else
        {
            if (h[find(x)] == null) puts("No");
            else puts("Yes");
        }
    }
    return 0;
}

代码解析:

1.N的范围:

const int N = 200003;//题目要求N的范围是[0,10^5],但从经验上一维数组的长度要开到要求的2-3倍。
                     //这样就可以最大程度地降低冲突的概率,那么N取大于范围的第一个质数。

2.初始化的值:

const int null = 0x3f3f3f3f;//设置一个数表示这个坑位没有人,即设定数组的初始化的值,
                            //且这个要在N的范围之外。

3.查找函数【核心操作】

int find(int x)
{
    int t = (x % N + N) % N;
    while (h[t] != null && h[t] != x)//表示坑位不为0,且坑位内不是查找的值
    {
        t ++ ;//看下一个坑位
        if (t == N) t = 0;//看完了最后的坑位,要返回到第一个坑位,循环回来看第一个坑位i
    }
    return t;//两种含义:k在哈希表中,返回k在哈希表的下标,如果不在哈希表中,则返回x应该存在哈希表的位置
}

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.我慢慢开始自渡了,变得不悲不喜,我接受世界上所有的不公平,善良并带点锋芒,我请求我自己,热爱 生活热爱自己。

2.人最怕的就是清醒的堕落,什么都懂,却不行动,没有压力,无忧无虑,没有目标,加上一点迷茫,到最 后还是维持现状。

3.我们总是喜欢用顺其自然来敷衍人生道路上的荆棘坎坷,却很少承认,真正的顺其自然,其实是竭尽所能 之后的不强求 ,而不是两手一摊的不作为。

4.你把性格交给星座,把努力交给鸡汤,把运气交给锦鲤,然后对自己说听过许多道理,但依然过不好这一 生。倒也是,过的好了才有鬼呢。

5. 你在人群中看到的每一个耀眼的人,都是踩着刀尖过来的。你如履平地般地舒适坦然,当然不配拥有任何 光芒。

最后如果觉得我写的还不错,请不要忘记==点赞==✌,==收藏==✌,加==关注==✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚==菜鸟==逐渐成为==大佬==。加油,为自己点赞!

目录
相关文章
|
4月前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
99 2
|
6月前
|
存储 算法 数据处理
公司局域网管理中的哈希表查找优化 C++ 算法探究
在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
|
8月前
|
存储 算法 安全
探究‘公司禁用 U 盘’背后的哈希表算法与 Java 实现
在数字化办公时代,信息安全至关重要。许多公司采取“禁用U盘”策略,利用哈希表算法高效管理外接设备的接入权限。哈希表通过哈希函数将设备标识映射到数组索引,快速判断U盘是否授权。例如,公司预先将允许的U盘标识存入哈希表,新设备接入时迅速验证,未授权则禁止传输并报警。这有效防止恶意软件和数据泄露,保障企业信息安全。 代码示例展示了如何用Java实现简单的哈希表,模拟公司U盘管控场景。哈希表不仅用于设备管理,还在文件索引、用户权限等多方面助力信息安全防线的构建,为企业数字化进程保驾护航。
|
5月前
|
存储 监控 算法
员工行为监控软件中的 Go 语言哈希表算法:理论、实现与分析
当代企业管理体系中,员工行为监控软件已逐步成为维护企业信息安全、提升工作效能的关键工具。这类软件能够实时记录员工操作行为,为企业管理者提供数据驱动的决策依据。其核心支撑技术在于数据结构与算法的精妙运用。本文聚焦于 Go 语言中的哈希表算法,深入探究其在员工行为监控软件中的应用逻辑与实现机制。
144 14
|
5月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
145 7
|
5月前
|
存储 监控 算法
基于 C++ 哈希表算法的局域网如何监控电脑技术解析
当代数字化办公与生活环境中,局域网的广泛应用极大地提升了信息交互的效率与便捷性。然而,出于网络安全管理、资源合理分配以及合规性要求等多方面的考量,对局域网内计算机进行有效监控成为一项至关重要的任务。实现局域网内计算机监控,涉及多种数据结构与算法的运用。本文聚焦于 C++ 编程语言中的哈希表算法,深入探讨其在局域网计算机监控场景中的应用,并通过详尽的代码示例进行阐释。
111 4
|
11月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
190 0
数据结构与算法学习十五:哈希表
|
5月前
|
存储 监控 算法
单位电脑监控软件中 PHP 哈希表算法的深度剖析与理论探究
数字化办公的时代背景下,单位电脑监控软件已成为企业维护信息安全、提升工作效率的关键工具。此类软件可全面监测员工的电脑操作行为,收集海量数据,故而高效管理和处理这些数据显得尤为重要。数据结构与算法在此过程中发挥着核心作用。本文将聚焦于哈希表这一在单位电脑监控软件中广泛应用的数据结构,并通过 PHP 语言实现相关功能,为优化单位电脑监控软件提供技术支持。
90 3
|
5月前
|
存储 监控 算法
论内网电脑监控软件中 PHP 哈希表算法的深度剖析与探究
当代企业网络管理体系中,内网电脑监控软件占据着关键地位。其功能涵盖对员工电脑操作行为的实时监测,以此维护企业信息安全,同时助力企业优化网络资源配置,提升整体工作效能。在构建内网电脑监控软件的诸多技术中,数据结构与算法构成了核心支撑体系。本文聚焦于哈希表这一重要数据结构,深入剖析其在 PHP 语言环境下,如何为内网电脑监控软件的高效运作提供助力,并通过详实的代码示例予以阐释。
81 3
|
6月前
|
存储 监控 算法
基于 Python 哈希表算法的员工上网管理策略研究
于当下数字化办公环境而言,员工上网管理已成为企业运营管理的关键环节。企业有必要对员工的网络访问行为予以监控,以此确保信息安全并提升工作效率。在处理员工上网管理相关数据时,适宜的数据结构与算法起着举足轻重的作用。本文将深入探究哈希表这一数据结构在员工上网管理场景中的应用,并借助 Python 代码示例展开详尽阐述。
88 3

热门文章

最新文章