首页 > 其他分享 >哈希表

哈希表

时间:2024-09-10 16:35:15浏览次数:8  
标签:结点 idx int x% 插入 哈希 include

模拟散列表

把一个较大范围内的数转化为较小范围的数的集合。

模上一个数(x%N+N)%N防止下标出现负数

数据结构

用一个数组表示要插入的槽,如果哈希产生了冲突,则把数插入到槽中(单链表)。

数组+模拟链表

拉链法

实现代码:

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

const int N = 100003; // 最好选质数
int h[N],e[N],ne[N],idx;

// 把某个数插入到槽内
void insert(int x)
{
    int k = (x%N+N) % N; // 求槽的下标
    e[idx] = x; // e数组是存取插入所有数的数据
    ne[idx] = h[k]; // 开始终点为-1,指向上一个结点,记录单链表
    // 的上一个结点
    h[k] = idx++; // 结点递增
}
// 散列表查询
bool find(int x)
{
    // 找到所在的槽
    int k = (x%N+N)%N;
    for(int = h[k];i != -1;i=ne[i])
    {
        if(e[i] == x)	return true;
    }
    return false;
}
int main()
{
    // 先把每个槽都置为-1,因为没有上个结点存在
    memset(h,-1,sizeof h);
    
}

开放寻址法

在一个数组中存数,如果当前位置没有人,则可以插入;否则一直向后查找,直到找到一个空位进行插入。

#include<iostream>
#include<cstring>
using namespace std;
const int N = 200003, nul = 0x3f3f3f3f;
// N 应该为数据总数的整数倍数
int h[N];

int find(int x) // 查找和插入通用的函数
{
    int k = (x%N+N)%N;// 先锁定下标,再找空位
    while(h[k] != nul && h[k]!=x)
    {
        k++;
        if(k==N) k = 0; // 到尾了,返回头部进行插入
    }
    return k;
}
int main()
{
    memset(h,0x3f,sizeof h);
    int x;
    cin >> x;
    int k = find(x);
    // 插入
    h[k] = x; // 找到可以插入的空位
    
    // 查询
    if(h[k] != nul)	puts("存在该数字");
    // 如果当前的位置为空位,说明之前这个数字并没有进行插入,所以没有出现过
    
}

标签:结点,idx,int,x%,插入,哈希,include
From: https://www.cnblogs.com/ddja/p/18406665

相关文章

  • 哈希表、算法
    哈希表hash:在编程和数据结构中,"hash"通常指的是哈希函数,它是一种算法,用于将数据(通常是字符串)映射到一个固定大小的数字(哈希值)。哈希函数在哈希表中尤为重要,哈希表是一种通过哈希函数将键映射到表中位置的数据结构,以实现快速的数据插入和检索。哈希表(HashTable):也称为散......
  • 【Redis】redis5种数据类型(哈希)
    目录基本介绍命令HSETHGETHEXISTSHKEYSHVALSHGETALLHMGETHLENHSETNXHINCRBYHINCRBYFLOATHSTRLEN内部编码原生字符串类型、哈希类型、序列化字符串json作缓存的区别基本介绍哈希类型中的映射关系是field-value,用于区分redis整体的键值对(key-value)命令H......
  • LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现N*K时间复杂度
    3177.求出最长好子序列II题目链接题目描述给你一个整数数组nums和一个非负整数k。如果一个整数序列seq满足在下标范围[0,seq.length-2]中最多只有k个下标i满足seq[i]!=seq[i+1],那么我们称这个整数序列为好序列。请你返回nums中好子序列的最长长度......
  • LeetCode刷题-哈希表
    一:哈希表1、有key:value键值对这样的概念;就是字典;通过key得到value2、hash碰撞问题:就是key的内存地址相同;使用链表的方法解决3、字典常见操作#创建哈希表hash_tabel={}#添加元素hash_tabel['name']='admin'hash_tabel['age']=25#删除元素delhash_tabel['name']#修改元......
  • 2024.9.6 leetcode 70 爬楼梯 (哈希表/动态规划)
    题面70.爬楼梯-力扣(LeetCode)题解:极其经典的一道动态规划,比如要跳到10楼有f(10)种方法,可以分为1、先跳到9楼再往上跳1楼2、先跳到8楼再往上跳2楼,所以f(10)=f(8)+f(9),昨天复习了哈希表,所以用哈希练习一下。classSolution{public:intclimbStairs(intn){uno......
  • 2024.9.4 leetcode 169 多数元素 (哈希表)
    题面 169.多数元素-力扣(LeetCode)题解:复习(自学)了一下哈希表,unordered_map<int,int>umap定义一个表umap.find(nums[i])!=umap.end()判断是否存在umap.insert({nums[i],1})插入umap.erase(nums[i])清除C++容器类<unordered_map>|菜鸟教程(runoob.com)class......
  • 【C++从练气到飞升】19---哈希:哈希冲突 | 哈希函数 | 闭散列 | 开散列
     ......
  • CF 2010 C2. Message Transmission Error (hard version) (*1700) 字符串+哈希
    CF2010C2.MessageTransmissionError(hardversion)(*1700)字符串+哈希题目链接题意:给你一个字符串,让你判断是否是由某个字符串首尾拼接重叠而成的。思路:做法很多,最暴力就直接枚举字符串长度,然后哈希即可。代码:#include<bits/stdc++.h>usingnamespacestd;#def......
  • 一致性哈希(Consistent Hashing)
    基本概念        一致性哈希(ConsistentHashing)是一种特殊的哈希算法,主要用于解决分布式系统中数据分布的问题,尤其是在需要动态添加或移除服务器(节点)的情况下。传统哈希算法在节点变化时可能会导致大部分甚至全部的数据重新分布,这样会导致大量的数据迁移,增加了系统的......
  • 【代码随想录Day6】哈希表Part01|判断一个元素是否出现集合里
    哈希表理论基础文章讲解:哈希表理论基础要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。242.有效的字母异位词题目链接/文章讲解/视频讲解:有效的字母异位词定义一个哈希表record,遍历s,记录s中每个字母出现的次数,遍历t,减去t中每个字母出现的次数,遍历......