HASH表

本文介绍了一个关于数字盒子的操作问题,包括插入和删除操作,并探讨了如何使用哈希表来解决当数字范围较大时的问题。文章通过具体的代码示例展示了如何实现这些操作并确保效率。

数字盒子


问题描述

你有一个盒子,你可以往里面放数,也可以从里面取出数。

初始时,盒子是空的,你会依次做 Q 个操作,操作分为两类:

  1. 插入操作:询问盒子中是否存在数 x,如果不存在则把数 x 丢到盒子里。
  2. 删除操作:询问盒子中是否存在数 x,如果存在则取出 x。

对于每个操作,你需要输出是否成功插入或删除。

输入

第一行一个正整数 Q,表示操作个数。

接下来 Q 行依次描述每个操作。每行 2 个用空格隔开的非负整数 op,x 描述一个操作:op 表示操作类型,op=1 则表示这是一个插入操作,op=2 则表示这是一个删除操作;x 的意义与操作类型有关,具体见题目描述。

输出

按顺序对所有操作输出,对于每个操作输出一行,如果成功则输出“Succeeded”(不含引号),如果失败则输出“Failed”(不含引号)。

样例输入

6
1 100
1 100
2 100
1 200
2 100
2 200

样例输出

Succeeded
Failed
Succeeded
Succeeded
Failed
Succeeded

数据范围

对于 60% 的数据,保证 x<10^5。

对于 100% 的数据,保证 x<10^18,Q≤5*10^5。

对于所有数据,保证 op∈{1,2}。

时间限制:10 sec

空间限制:256 MB

提示

[对于 x 较小的情况,我们只需要用数组记录每个数是否在盒子里即可。]

[对于 x 较大的情况,我们可不可以用什么方法把它们“变小”呢?可以想想哈希表哦!]

 

#include <bits/stdc++.h>
using namespace std;

// ================= 代码实现开始 =================

typedef long long ll;

/* 请在这里定义你需要的全局变量 */
const int Mod = 1000003;
vector<ll> table[Mod];
int Hash(ll x) {
    return x% Mod;
    }

// 执行操作时会调用这个函数
// op:对应该次操作的 op(具体请见题目描述)
// x:对应该次操作的 x(具体请见题目描述)
// 返回值:如果输出为"Succeeded",则这个函数返回 1,否则返回 0
bool check(int op, ll x) {
    int h = Hash(x);
    vector<ll>::iterator ptr = table[h].end();
    for(vector<ll>::iterator it = table[h].begin();it!=table[h].end();it++)
    if(*it == x){
        ptr = it;
        break;
    }
    if(op==1){
        if(ptr==table[h].end()){
            table[h].insert(ptr,x);
            return 1;
        }return 0;
    }
    else{
        if(ptr!=table[h].end()){
            *ptr = table[h].back();
            table[h].erase(ptr);
            return 1;
        }return 0;
    }

}

 

### 原理 哈希Hash table,也叫散列)是以键 - 值(key - indexed)的形式存储的数据结构,可根据key快速查找到value。它通过把key值映射到中一个位置来访问记录,以加快查找的速度,这个映射函数叫做散列函数,存放记录的数组叫做散列 [^2]。 不过,哈希冲突是哈希使用中不可避免的问题。哈希冲突指不同的输入数据经过哈希函数处理后,得到相同的哈希值或哈希索的情况。因为哈希函数将多个可能的输入映射到有限的输出空间(即哈希的桶或槽) [^3]。 ### 应用 哈希由于其快速查找的特性,在很多场景都有广泛应用。比如在缓存系统中,可将经常访问的数据存放在哈希中,当需要访问数据时,先在哈希中查找,若找到则直接返回,从而提高访问速度;在数据库索中,也可利用哈希快速定位数据记录;在编程语言的字典、集合等数据结构的实现中,也常常使用哈希。 ### 实现 以下是一个简单使用Python实现的哈希示例,通过列和拉链法解决哈希冲突: ```python class HashTable: def __init__(self, size): # 初始化哈希,使用列存储数据 self.size = size self.table = [[] for _ in range(size)] def _hash(self, key): # 简单的哈希函数,将键转换为哈希的索 return key % self.size def put(self, key, value): # 插入键值对 index = self._hash(key) for pair in self.table[index]: if pair[0] == key: pair[1] = value return self.table[index].append([key, value]) def get(self, key): # 获取键对应的值 index = self._hash(key) for pair in self.table[index]: if pair[0] == key: return pair[1] return None def remove(self, key): # 删除键值对 index = self._hash(key) for i, pair in enumerate(self.table[index]): if pair[0] == key: del self.table[index][i] return # 使用示例 hash_table = HashTable(10) hash_table.put(1, 'apple') hash_table.put(2, 'banana') print(hash_table.get(1)) hash_table.remove(1) print(hash_table.get(1)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值