IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> acwing840 模拟散列表 2021/11/27 -> 正文阅读

[数据结构与算法]acwing840 模拟散列表 2021/11/27

维护一个集合,支持如下几种操作:

  1. I x,插入一个数?xx;
  2. Q x,询问数?xx?是否在集合中出现过;

现在要进行?NN?次操作,对于每个询问操作输出对应的结果。

输入格式

第一行包含整数?NN,表示操作数量。

接下来?NN?行,每行包含一个操作指令,操作指令为?I xQ x?中的一种。

输出格式

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

每个结果占一行。

数据范围

1≤N≤1051≤N≤105
?109≤x≤109?109≤x≤109

输入样例:

5
I 1
I 2
I 3
Q 2
Q 5

输出样例:

Yes
No

?一般来说,hash表的时间复杂度可以看作o1

这里先分享一下拉链法,会用到之前的单链表,但是我单链表的题没写题解,等会我去回头写一下单链表的题解

这个拉链法就是在坐标为0~1e5-1 的哈希表坐标上,在各个槽点分出去链表,算是每个槽点的值,运用单链表的方法来存储,然后在查询的时候,用同样的方法获得哈希表下标,然后一个个遍历这个槽点的值。

这个取哈希表坐标的方法叫除留余数法,mod的值应该是个质数,所以这道题取N = 1e5 + 3?

memset用法是把数组内所有的值赋值同一个数

memset(data, 0, sizeof(data)); 就是把data【】数组的值全部赋值为0;

它插入的时候是一直在交界处增加新值。

#include<iostream>
#include<cstring>
using namespace std ;
const int N = 1e5 + 3 ;
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[i] == x)
           return true ;
    }
    return false ;
}
int main()
{
    int x ;
    int n ;
    cin >> n ;
    memset(h , -1 , sizeof(h)) ;
    while(n--)
    {
        char op[2];
    scanf("%s%d" , op , &x);
    if(*op == 'I')
    {
        insert(x);
    }
    else
    {
        if(find(x)) cout << "Yes" <<endl;
        else cout << "No" << endl ;
    }
    }
    
}

?开放寻址法(蹲坑法)

只需要一个数组,find函数返回“坑位”

0×3f3f3f3f是acm中常用的无穷大变量

这个方法的数组长度是给定长度的2~3倍,所以这里N = 2e5 + 3

当k==N的时候相当于坑位走了一遍,让k从第0个坑位重新找hh

#include<iostream>
#include<cstring>
using namespace std ;
const int N = 2e5 + 3  , null = 0x3f3f3f3f;
int h[N] ;

int find(int x)
{
    int k = (x % N + N) % N ;
    while(h[k] != null && h[k] != x)
      {
          k++ ;
          if(k == N) k = 0 ;
      }
     return  k ;
}
int main()
{
    int n ;
    cin >> n ;
    memset(h , 0x3f , sizeof h) ;
    while(n--)
    {
      char op[2];
      int x ;
      scanf("%s%d" , op , &x);
      int k = find(x) ;
      if(*op == 'I')
      {
        h[k] = x ;
      }
      else
      {
        if(h[k] != null) cout << "Yes" <<endl;
        else cout << "No" << endl ;
      }
    }
   return 0 ;
}


?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-11-28 11:32:46  更:2021-11-28 11:35:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 12:49:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码