数据结构基础-散列表(Hash)

本文介绍了哈希表在数据集合中进行元素查找的高效性,通过哈希算法实现O(1)的时间复杂度。文章提供了C++, Java, Python的代码示例,展示了如何计算哈希值并实现查找和插入操作。同时,讨论了哈希冲突的解决方法,包括线性探测再散列。
摘要由CSDN通过智能技术生成

为什么使用哈希表

判断现有数据集合中是否有这个元素,或者是否有满足条件的元素。

其中的 Hash 算法则可以帮助我们判断是否有这个元素,虽然功能简单,但是其 O(1)
时间复杂度是具有高性能的。通过在记录的存储地址和它的关键码之间建立一个确定的对应关系。这样,不经过比较,一次读取就能得到所查元素的查找方法。相比普通的查找算法来说,仅仅在比较的环节,就会大大减少查找或映射所需要的时间。
在这里插入图片描述

散列

c++
    const int MOD=P;

    int Hx(int n)
    {
        return n%MOD;
    }

Java
        
    final Integer MOD=P;

    Integer Hx(int n)
    {
        return n%MOD;
    }

 python 

    MOD=P #由于Python不含常量,我们这里就不做修饰

    Hx(n):
        global MOD
        return n%MOD

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

#include <iostream>
#include <stack>
using namespace std;

const int h = 12582917;

string Value[h];

string UpValue[h];

int UpValueCount = 0;

int Hx(string s)
{

    int n = s.size();

    int sum1 = 0;

    for (int i = 0; i < n; i++)
    {

        sum1 = sum1 * 131 % h + (s[i] - 'a' + 1) % h;
    }

    return (sum1 + h) % h;
}

bool isAt(string s)
{
    int n = Hx(s);
    if (Value[n] == "")
        return false;
    else if (Value[n] == s)
        return true;
    else
    {
        for (int i = 0; i < UpValueCount; i++)
            if (UpValue[n] == s)
                return true;

        return false;
    }
}

bool in(string s)
{
    int n = Hx(s);
    if (Value[n] == "")
    {
        Value[n] = s;
        return true;
    }
    else if (Value[n] == s)
        return false;
    else
    {
        for (int i = 0; i < UpValueCount; i++)
            if (UpValue[n] == s)
                return false;

        UpValue[UpValueCount++] = s;
        return true;
    }
}

int main()
{

    int n;
    string ans = "NO";
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        string word;
        cin >> word;

        if (!in(word))
        {
            cout << word << endl;
            return 0;
        }
    }
    cout << ans << endl;
}

学习参考
https://www.lanqiao.cn/courses/3993

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠风丶北枝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值