数据结构(三)——Hash表

前言

重学算法第7天,希望能坚持打卡不间断,从基础课开始直到学完提高课。
明天再来!肝就完了

2月19日,day07 打卡

今日已学完y总的
算法基础课-2.5-第二章 数据结构(三)
共2题,知识点如下
哈希表:
模拟散列表、
字符串哈希。

以及介绍了算法中STL常用容器的基本用法及函数。

Hash表

按照冲突的处理方式,分为两种。即开发寻址法和拉链法
在这里插入图片描述

将一堆数据映射到0-N
在这里插入图片描述

将-109到109范围的数,映射到[0,10^5^]

之前的离散化是一种极其特殊的哈希方式(需要保序),
这里讲的是一般意义的哈希方式。不太一样

拉链法:两个数冲突,就用一条链都给它存下来
在这里插入图片描述
哈希算法是一种期望算法,虽然每个槽会拉一个链
但平均情况下看,每个链的长度都可以看成一个常数,
所以一般情况下,哈希表的时间复杂度可以看成O(1)

算法题中一般是不需要在哈希表中执行删除元素
一般只有添加和查找两个操作(算法题中)

基本操作

添加操作:在h(x)下面拉个链存进去
查找操作:看看h(x)下面那个链,遍历一遍
删除操作:如果非要整,也不会真的删除,会在链上那点用bool变量标记一下

开放寻址法和拉链法都很常用,任选一种即可

数组长度,也就是模的那个数(上面是105),
一般要取成质数,而且这个质数要离2的整次幂尽可能的远
数学上可以证明,如果这么选,冲突的概率是最小的

找出大于10w的最小的质数,即100003

#include <iostream>

using namespace std;

const int N = 100003;

int main() {
   
    for (int i = 100000;;i++) {
   
        bool flag = true;
        for (int j = 2; j * j <= i; j++)
            if (i % j == 0) {
   
                flag = false;
                break;
            }
        if (flag) {
   
            cout << i << endl;
            break;
        }
    }
    return 0;
}

// 100003

一般哈希

模板

(1) 拉链法
    int h[N], e[N], ne[N], idx;

    // 向哈希表中插入一个数
    void insert(int x)
    {
   
        int k = (x % N + N) % N;
        e[idx] = x;
        ne[idx] = h[k];
        h[k] = idx ++ ;
    }

    // 在哈希表中查询某个数是否存在
    bool find(int x)
    {
   
        int k = (x % N + N) % N;
        for (int i = h[k]; i != -1; i = ne[i])
            if (e
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值