散列的介绍

散列(hash)是常用的算法思想之一,在很多程序上都会有意无意的使用到。用一句话来概括散列思想的话就是:“将元素通过一个函数转换为整数,使得该整数可以尽量唯一地代表这个元素”。其中把转换函数称为散列函数H。

那么对key是整数来说,有哪些常用的散列函数呢?一般来说,常见的散列函数有直接定址法、平方取中法、除留余数法,其中直接定址法是指恒等变换(即H(key)=key,很多问题都是直接把key作为数组下标,是最常见最实用的散列应用)。

散列的适用情形

那么,什么情况下使用散列思想呢?如何在竞赛或者考试中联想到散列思想呢?

  1. 在使用散列思想时,题目一般会给出两个字符串或者两个数组,这两个字符串或者的元素之间存在ans=S1-S2的类似关系;
  2. 题目用于其中某个字符串查询另一个字符串中的元素的情形;

散列的运用

下面给出一些散列思想的运用。

【PAT】B1039

#include <stdio.h>
#include <string.h>
int main(){char hashTable[1010]={0};char str1[1010],str2[1010]; int sum=0;gets(str1);gets(str2);int len_a=strlen(str1);int len_b=strlen(str2);for(int i=0;i<len_a;i++){  //数组的下标是珠子颜色的代表字符,统计每种颜色各有多少个珠子hashTable[str1[i]]++; }for(int i=0;i<len_b;i++){  //统计完毕后,将需要得到的珠子减去原有的珠子,若出现负数,则表                            示某种颜色的珠子少于需求hashTable[str2[i]]--;}for(int i=0;i<len_b;i++){if(hashTable[str2[i]]<0){sum=sum+hashTable[str2[i]];hashTable[str2[i]]=0;}}if(sum<0) printf("No %d",0-sum);else printf("Yes %d",len_a-len_b);return 0;
} 

【PAT】B1042

#include <stdio.h>
#include <string.h>
int main(){int HashTable[256]={0};int k=0,len;char str[1010],j;gets(str);len=strlen(str);for(int i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z'){HashTable[str[i]-'A']++;  //将标记字符转化为唯一字符表示,这适用于字符串中给出大小写,但实际不需要区分大小写的情况}else if(str[i]>='a'&&str[i]<='z'){HashTable[str[i]-'a']++;}else HashTable[str[i]]=0;}for(int i=0;i<26;i++){if(HashTable[i]>HashTable[k]){k=i;}}printf("%c %d\n",'a'+k,HashTable[k]);return 0;
}

【PAT】A1048

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main(){int n,m,a;int hashtable[1005]={0};scanf("%d%d",&n,&m);for(int i=0;i<n;i++){scanf("%d",&a);++hashtable[a];  //将输入的数字作为数组的下标存储起来,把数组+下标的组合来存放该下标(即数字)的个数}for(int i=1;i<m;i++){if(hashtable[i]&&hashtable[m-i]){if(i==m-i&&hashtable[i]<=1){continue;}printf("%d %d\n",i,m-i);return 0;}}printf("No Solution\n");return 0;
} 

综    述

使用散列表示的方式一般有:

  1. 以数组的下标作为记录该数字的存在与否(通过int hashtable[maxn]={0}或者bool hashtable[maxn]={false});
  2. 以数组的下标作为改为字符记录;
  3. 以数组的下标和数组本身结合,记录下标(即数字或者字符)出现的次数(如hashtable[3]=2,hashtable['P']=3分别表示3出现了2次,字符P出现了3次)。

看到题目后应结合题目具体分析寻找最简单的解法。

【PAT笔记】PAT中的散列思想相关推荐

  1. 数据结构笔记(六)——散列(Hash Table)之双散列和再散列(4)

    虽然平方探测排除了一次聚集,但散列到同一位置的元素仍然会探测相同的备选位置,比如当冲突函数为i^2时,对于每个要插入的X,其向前探测地步长都是0,1,4,9,16,这样对于散列到同一位置的X,他们都会 ...

  2. HashMap中计算散列位置时,用与运算代替取模运算的原理

    Java 中 HashMap 计算散列值函数如下: static final int hash(Object obj) {int i;return obj != null ? (i = obj.has ...

  3. python学习笔记(二)——散列类型(字典、集合)

    目录 集合 字典 集合 无序(元素位置不固定).唯一(相每个元素唯一).可变类型(元素可变). set 函数方法 注释 增 add 将元素添加到集合中. 删 pop 删除并返回任意set元素. rem ...

  4. ConcurrentHashMap中的散列算法有什么含义

    今天无聊又去看看源码,有了2个思考. 1.为什么选择本身与高16位部分做运算 2.为什么选择异或算法 答:与右移16位后的本身做异或运算是为了让高16位也参与运算,使得结果更加的随机,不然基本大多数情 ...

  5. 散列查找中,什么叫冲突,什么叫聚集(堆积)

    写在前边的话:你的支持是我写作的动力,有帮助到你的话麻烦点赞加收藏呦.感激不尽!如有错误也请留言指正. 考研数据结构练习,欢迎订阅我的专辑<考研数据结构题型分类讲解练习> 目录 一.概念解 ...

  6. 【ADT】第五章 散列

    散列表ADT是一个包含一些项的具有固定大小的数组 散列是一种以常数平均时间O(1)执行插入.删除.查找的技术 JavaCollection中基于散列技术实现了HashSet.HashMap 不支持排序 ...

  7. PTA数据结构题目集 第十一周——散列查找

    目录 11-散列1 电话聊天狂人 (25分) 思路 代码 测试点 11-散列2 Hashing (25分) 思路 代码 测试点 11-散列3 QQ帐户的申请与登陆 (25分) 题目大意 思路 代码 测 ...

  8. 对散列冲突的处理——开放定址法

    对散列冲突的处理--开放定址法 之前聊了聊用分离链接法解决散列冲突的问题,这次就来聊聊对散列冲突的另一种解决办法:开放定址法.开放定址法分为线性探测,平方探测,双散列三种方法. 开放定址法 分离链接法 ...

  9. 2.8加密工具与散列

    1.crypt是一个简单的加密工具,它从stdin接受一个文件以及口令作为输入,然后将加密数据输出到stdout(因此要对输入.输出文件使用重定向). eg:$ crypt  < input_f ...

最新文章

  1. java中rs怎么用_java-如何使用JAX-RS设置字符集?
  2. jQuery中的$el是什么意思
  3. [排序算法] 选择排序(2种)
  4. Windows下Caffe的学习与应用(三)——使用OpenCV3调用自己训练好的Caffe模型进行图像分类
  5. 1-2. linux系统结构
  6. mybatis 多租户saas_彻底理解微商城多租户Saas架构设计
  7. android 交叉编译so,Android交叉编译htop和使用方法
  8. 登陆拦截拦截ajax,过滤器实现登录拦截需要注意的问题(AJAX请求的处理)
  9. matlab旋转机械转子故障信号仿真,旋转机械转子不对中故障诊断技术研究解说.docx...
  10. 学习C++的第一本书
  11. 写ios系统和安卓系统的人到底有多牛?
  12. jQuery HTML操作
  13. 今天修了一个bug,关于debug日志的问题
  14. 论文阅读220403_Autonomous Driving on Curvy Roads Without Reliance on Frenet Frame: A Cartesian-Based
  15. java ZipEntry 压缩 解压缩 在linux下中文乱码问题解决
  16. wmic命令行工具介绍
  17. 混淆电路(Garbled Circuit)
  18. 线性方程组解个数的判定和求解
  19. kali-2019.4中文乱码问题的解决
  20. Laravel 生成Controller

热门文章

  1. jQuery Mobile 1.1八大新特性介绍
  2. CodeBlocks 更改 gui 程序为 命令行
  3. iOS开发笔记[13/50]:解决SenTestingKit/SenTestingKit.h: No such file or directory问题
  4. 关于用飞信框架运行net程序-用批处理运行
  5. cout 输出指定位数,不足补0
  6. nrf51822-添加DFU服务
  7. 使用IDEA在SpringBoot项目中连接数据库
  8. ajax头文件报错,AJAX的CSRF保护
  9. DES对称加密(2)三重DES
  10. 差分能量分析介绍(三)