散列+哈希

散列法:

#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
const int N = 100010, null = 0x3f3f3f3f;
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 find1(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, -1, sizeof h);
    while(n--)
    {
        char op;
        int x;
        cin>>op>>x;
        if(op == ‘I‘)
            insert(x);
        else{
            if(find(x)) puts("Yes");
            else puts("No");
        }
    }
}

字符串哈希:

#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
typedef unsigned long long  ULL;
const int N = 100010, P = 131;
int n,m;
char str[N];
ULL h[N], p[N];
ULL get(int l, int r)
{
    return h[r] - h[l - 1] * p[r-l+1];
}
int main()
{
    cin>>n>>m>>str+1;
    p[0] = 1;
    for(int i = 1;i<=n;i++)
    {
        p[i] = p[i-1] * P;
        h[i] = h[i-1] * P + str[i];
    }
    while(m--)
    {
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        if(get(l1,r1) == get(l2,r2)) puts("Yes");
        else puts("No");
    }
}

原文地址:https://www.cnblogs.com/longxue1991/p/12695100.html

时间: 2024-07-30 09:13:43

散列+哈希的相关文章

数据结构与算法----散列/哈希

1. 简介 散列表的实现叫散列hashing,散列用于以常数平均时间执行 插入.删除.查找,不支持排序.findMin.findMax. 查找关键字不需要 比较 在一个记录的存储位置和它的关键字之间建立映射关系:key--f(key)   这个关系就是散列函数/哈希函数.将一些记录存储在一块 连续 的存储空间,这块空间就是散列表/哈希表. 与线性表.树.图比较: 数据元素之间没有什么逻辑关系,也不能用连线图表示出来. 问题: 关键字不同,但通过散列函数计算的结果相同,即出现了冲突 collisi

哈希表---线性探测再散列(hash)

//哈希表---线性探测再散列 #include <iostream> #include <string> #include <stdio.h> #include <string.h> #define m 10000 #define NULLkey -1 using namespace std; int HashTable[m]; int Hash_search( int k) { int p0, pi; p0=hash(k); //函数运算值 if(Has

哈希冲突的处理【闭散列方法-线性探测和二次探测】

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个映射函数叫做散列函数,存放记录的数组叫做散列表. 给定表M,存在函数Hash(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数Hash(key)为哈希(Hash) 函数. 构造哈希表的两种方法 1.直接定址法--取关键字的某个线性函数为散列地

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

查找之散列查找(哈希表)

本学习笔记部分内容来自网易云课堂浙江大学数据结构课程,谢谢! 1.散列表(哈希表) 已知的几种查找方法: 顺序查找  O(N) 二分查找(静态查找)  O(logN) 二叉搜索树      O(h)  h为二叉树高度   (动态查找:有插入有删除有查找) 平衡二叉树      O(logN) 查找的本质:已知对象找位置 1.有序安排对象:全序或半序: 2.直接算出对象位置:散列. 散列查找法的两项基本工作: 1.计算位置:构造散列函数确定关键词存储位置: 2.解决冲突:应用某种策略解决多个关键词

Java 对字符串数据进行MD5/SHA1哈希散列运算

Java对字符串数据进行MD5/SHA1哈希散列运算 [java] view plain copy package cn.aibo.test; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class TestMd5AndSha1 { public static String md5(String data) throws NoSuchAlgorithmExcep

处理哈希冲突的闭散列方法-线性探测

说到哈希冲突,就必须谈到哈希函数了. 什么时候哈希函数 哈希冲突函数hv(i),用于在元素i发生哈希冲突时,将其映射至另一个内存位置. 什么是哈希冲突 哈希冲突即关键字不同的元素被映射到了同一个内存位置,包括由同义词冲突和非同义词冲突. 处理哈希冲突的方法很多,这里浅谈一下处理哈希冲突的闭散列方法: 线性探测 如下图所示 在上图中,这里key取8. 实现线性探测代码: #pragma once #include<string> enum Status { EXIST, EMPTY, DELET

散列算法和哈希表结构

散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 哈希表 数组的特点是:寻址容易,插入和删除困难:

DS哈希查找—二次探测再散列

题目描述 定义哈希函数为H(key) = key%11.输入表长(大于.等于11),输入关键字集合,用二次探测再散列构建哈希表,并查找给定关键字. 输入 测试次数t 每组测试数据格式如下: 哈希表长m.关键字个数n n个关键字 查找次数k k个待查关键字 输出 对每组测试数据,输出以下信息: 构造的哈希表信息,数组中没有关键字的位置输出NULL 对k个待查关键字,分别输出: 0或1(0—不成功,1—成功).比较次数.查找成功的位置(从1开始) 样例输入 1 12 10 22 19 21 8 9