5.21

哈希表


Hash表又称为散列表,一般由Hash函数(散列函数)与链表结构共同实现,与离散化思想类似。

一般要求:防止冲突,便于查询

模拟hash表:

  • 拉链法:两个核心操作insert(),find();

    • int h[N], e[N], ne[N], idx; //邻接表进行存储;

    • void insert(int x) {
      // c++中如果是负数 那他取模也是负的 所以 加N 再 %N 就一定是一个正数
      int k = (x % N + N) % N;
      //hash防冲突取值
      e[idx] = x;
      //赋值
      ne[idx] = h[k];
      //h[k]是一个拉链的结点,例如2下面的拉链;
      h[k] = idx++;
      //通过拉链进行延申
      }
    • bool find(int x) {
      //用上面同样的 Hash函数 讲x映射到 从 0-1e5 之间的数
      int k = (x % N + N) % N;
      for (int i = h[k]; i != -1; i = ne[i]) {
      //经典的邻链表的遍历操作;
      if (e[i] == x) {
      return true;
      //能找到
      }
      }
      return false;
      }

例题链接:https://www.acwing.com/problem/content/842/


  • #include "cstring"
    #include "iostream"
    using namespace std;
    const int N = 100003;
    int h[N], e[N], ne[N], idx;
    void insert(int x) {
    int t = (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[i] == x)
    return true;
    }
    return false;
    }
    int main() {
    // for (int i = 100000; i; i++) {
    // bool flag = true;
    // for (int j = 2; j * j < i; j++) {
    // if (i % j == 0) {
    // flag = false;
    // break;
    // }
    // }
    // if (flag) {
    // cout << i;
    // break;
    // }
    // }
    //这里是找到N的操作,一般是取质数为hash计算的最好办法
    memset(h, -1, sizeof h);
    //将槽先清空 空指针一般用 -1 来表示
    int m;
    cin >> m;
    while (m--) {
    char op;
    int x;
    cin >> op >> x;
    if (op == 'I') {
    insert(x); } else {
    if (find(x))
    cout << "Yes" << endl;
    else
    cout << "No" << endl;
    }
    }
    return 0;
    }0;
    }< "No" << endl;
    }
    }
    return 0;
    }

  • 开放寻址法(推荐):

  • 其实就是开辟两到三倍的一维数组空间大小来存放原来的数值;

  • 主要方法:find(int x)找到x;两种结果

    • 如果能找到,就返回x的下标,同时也对应着query操作

    • 如果不能找到,那么返回x需要被插入的位置,对应着insert的操作;

  • #include "cstring"
    #include "iostream"
    using namespace std;
    const int N = 200003, null = 0x3f3f3f3f;
    int h[N];
    int find(int x) {
    //找一个数是否存在,结果两种:一是存在的话,就返回它的位置,如果不存在,那么就需要返回它被插入的位置;
    int k = (x % N + N) % N;
    //散列原数,同时也找到x的位置
    while (h[k] != null && h[k] != x) {
    //如果k位置的元素是空要么k位置的元素就是x的位置,那么就不需要判断,直接返回k就是要找的位置
    k++;
    //如果当前位置被人家占了,就往后挪,直到N数组总长。总长都不够就从头开始
    if (k == N)
    k = 0;
    }
    return k;
    }
    int main() {
    int m;
    cin >> m;
    memset(h, 0x3f, sizeof h);
    //对所有元素初始化为null配合h[k]!=null的查找
    while (m--) {
    char op;
    int x;
    cin >> op >> x;
    int k = find(x);
    if (op == 'I')
    h[k] = x;
    //直接将k的位置给x元素就行
    else {
    if (h[k] != null)
    //说明存在元素;
    cout << "Yes" << endl;
    else
    cout << "No" << endl;
    }
    }
    return 0;
    }

磊磊零基础打卡算法:day18 c++模拟哈希表来模拟散列表的更多相关文章

  1. Java数据结构和算法(十三)——哈希表

    Hash表也称散列表,也有直接译作哈希表,Hash表是一种根据关键字值(key - value)而直接进行访问的数据结构.它基于数组,通过把关键字映射到数组的某个下标来加快查找速度,但是又和数组.链表 ...

  2. 算法导论 第十章 基本数据类型 & 第十一章 散列表(python)

    更多的理论细节可以用<数据结构>严蔚敏 看几遍,数据结构很重要是实现算法的很大一部分 下面主要谈谈python怎么实现 10.1 栈和队列 栈:后进先出LIFO 队列:先进先出FIFO p ...

  3. 数据结构与算法Python版 熟悉哈希表,了解Python字典底层实现

    Hash Table 散列表(hash table)也被称为哈希表,它是一种根据键(key)来存储值(value)的特殊线性结构. 常用于迅速的无序单点查找,其查找速度可达到常数级别的O(1). 散列 ...

  4. 零基础学C#算法(零基础学算法——C#版)

    今天本人正在看算法方面的书.作为高中数学忘得差不多的渣渣,实在无力.无奈找了本书,c语言写的,哎.我就把其中代码翻译成C#版好了.此坑能否填平,看我耐性和网络支持条件吧.有生之年能看完的话我会把整个项 ...

  5. Leedcode算法专题训练(哈希表)

    Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 2 ...

  6. Java基础知识笔记(一:修饰词、向量、哈希表)

    一.Java语言的特点(养成经常查看Java在线帮助文档的习惯) (1)简单性:Java语言是在C和C++计算机语言的基础上进行简化和改进的一种新型计算机语言.它去掉了C和C++最难正确应用的指针和最 ...

  7. 散列表(hash table)——算法导论(13)

    1. 引言 许多应用都需要动态集合结构,它至少需要支持Insert,search和delete字典操作.散列表(hash table)是实现字典操作的一种有效的数据结构. 2. 直接寻址表 在介绍散列 ...

  8. 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础

    ---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...

  9. Android零基础入门第71节:CardView简单实现卡片式布局

    还记得我们一共学过了多少UI控件了吗?都掌握的怎么样啊. 安卓中一些常用控件学习得差不多了,今天再来学习一个新的控件CardView,在实际开发中也有非常高的地位. 一.CardView简介 Card ...

  10. 【零基础学习iOS开发】【转载】

    原文地址:http://www.cnblogs.com/mjios/archive/2013/04/24/3039357.html 本文目录 一.什么是iOS 二.主流手机操作系统 三.什么是iOS开 ...

随机推荐

  1. Docker的资源限制

    CPU CGROUP MEM CGROUP Storage 默认的overlay fs不支持配额,需要底层文件系统如xfs,ext4的支持. 在docker中启用示例如下,限制单个容器最大使用空间为2 ...

  2. 自定义jar包供ERP使用

    功能要求:需要在ERP中调用其他web服务或者自身web服务(比如跨账套过账等) 1.编写java程序,并将程序打包成jar包 import org.apache.http.HttpEntity; i ...

  3. Centos+django+uwsgi+python 环境搭建

    首先需要具备linux的基本操作. centos 6.x 版本默认安装的 python 版本为2.x 输入: [root@dev ~]# python -VPython 2.6.6 下面装一些用到的库 ...

  4. Jmeter(三十九) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 上篇(详解教程)

    ------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.co ...

  5. FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 工业图像输出 图像模拟源

    FMC128-基于FMC 1路HD-SDI输入输出,1路复合视频输入输出子卡 一.板卡概述       FMC板卡包含1路HD-SDI 输入输出,1路复合视频输入输出,用于高清.标清相机的产品测试及智 ...

  6. vue的双向绑定规则

    vue提供了v-model双向绑定指令,用来辅助在不操作DOM的前提下,快速读取表单的数据 <!DOCTYPE html> <html lang="en"> ...

  7. HDFS Shell 操作

    HDFS Shell 操作 HDFS Shell 命令行格式 格式一:hadoop fs –命令名 参数 格式二:hdfs dfs –命令名 参数 HDFS 常用命令及参数 ls:查看 hdfs 中的 ...

  8. sourceTree工具使用方法

    https://www.cnblogs.com/tian-xie/p/6264104.html

  9. C#textbox控件区分扫码枪输入和键盘输入

    前言: 一般我们在某个UI界面输入内容的时候又不想人为的去键盘输入,这个时候就需要区分键盘输入和扫码枪的输入,从而禁止人为键盘输入内容,只能使用扫码枪扫码输入.就目前来说这种直插式扫码枪输入和键盘输入 ...

  10. java为什么要使用静态内部类

    参考:https://blog.csdn.net/fengyuyeguirenenen/article/details/122696650 static内部类意味着: (1) 为创建一个static内 ...