Hash 表
更多内容,前往 IT-BLOG
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
数组的优缺点是:寻址容易,插入和删除困难;
链表的优缺点是:寻址困难,插入和删除容易;
我们综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构?答案是肯定的,这就是我们要提起的哈希表,哈希表有多种不同的实现方法,我接下来解释的是最常用的一种方法——拉链法,我们可以理解为“链表的数组”,如图:左边很明显是个数组,数组的每个成员包括一个Head指针,指向一个链表的头,当然这个链表可能为空,也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去,也是根据这些特征,找到正确的链表,再从链表中找出这个元素。
Hash表代码展示:这里的链表直接使用了 JDK默认的链表(LinkedList),比较简单如果自己实现更好点。如果自己动链表的实现则直接使用 JDK提供的即可,不懂最好学一下链表的使用。自己实现一个链表。HashTable底层的链表 Head 指针永远指向第一个元素,如果没有元素则为空。增删改查操作都是从 Head 链表开始向下遍历即可。HashTable的查询速度非常的快,几乎是 O(1)的时间复杂度,hash就是找到一种数据内容和数据存放地址之间的映射关系。而散列法指元素特征转变为数组下标的方法。
1 package com.algorithms;
2
3 import java.util.Iterator;
4 import java.util.LinkedList;
5
6 /**
7 * hashTabe 哈希表的应用分析:
8 * 【1】HashTable是由数组和链表组成
9 * 【2】创建需要的数组大小
10 * 【3】创建链表:这里我就直接使用JDK提供的linkedList 链表了
11 * 【4】hashTabel中需要存放对象,我们先创建自己要存放的对象 Emp
12 * 【5】思想:将emp的no根据最简单的散列函数(取模)算出要存放的下标,接着将数据顺序的存放在链表中
13 * 【6】问题:简单的散列算法,会导致数据分布不均匀,会出现长链表。HashMap中使用key的hashcode然后在于分配大小的2的幂次数进行位运算计算
14 */
15
16 public class HashTable {
17 //定义一个数组
18 private LinkedList[] arry;
19 //用户定义的hashTable的大小
20 private int size;
21
22 //构造函数,初始化数组和链表
23 public HashTable(int size){
24 this.size = size;
25 arry = new LinkedList[size];
26 //对链表进行初始化
27 for(int i = 0;i<size;i++){
28 //这里的链表我们就直接用 LinkedList 了JDK提供的,不自己手动写了。
29 arry[i] = new LinkedList();
30 }
31 }
32
33 //向数组中插入元素 【增】
34 public void put(Emp emp){
35 if(emp == null){
36 throw new IllegalArgumentException("传入的参数为空");
37 }
38 //首先获取 emp 的no对其取模
39 int index = emp.getNo() % size;
40 arry[index].add(emp);
41 }
42
43 //删除节点 【删】
44 public void del(Emp emp){
45 if(emp == null){
46 throw new IllegalArgumentException("传入的参数为空");
47 }
48 //首先获取 emp 的no对其取模
49 int index = emp.getNo() % size;
50 arry[index].remove(emp);
51 }
52
53 //查询链表中的元素 【列表】
54 public void list(){
55 for(int i=0;i<size;i++){
56 Iterator iterator = arry[i].iterator();
57 System.out.printf("展示第%d个链表内容:",i+1);
58 while(iterator.hasNext()){
59 Emp emp = (Emp)iterator.next();
60 System.out.printf(""+emp);
61 }
62 System.out.println("");
63 }
64 }
65
66 //主函数觉得不是很重要,放最后了,用来测试
67 public static void main(String[] args) {
68
69 HashTable hashTable = new HashTable(6);
70 //组装数据
71 hashTable.put(new Emp(1,"曹操"));
72 hashTable.put(new Emp(2,"刘备"));
73
74 hashTable.list();
75 }
76 }
77
78 class Emp{
79 private int no;
80 private String name;
81 //构造器
82
83 public Emp(int no, String name) {
84 this.no = no;
85 this.name = name;
86 }
87
88 public int getNo() {
89 return no;
90 }
91
92 public String getName() {
93 return name;
94 }
95
96 @Override
97 public String toString() {
98 return "Emp{" +
99 "no=" + no +
100 ", name='" + name + '\'' +
101 '}';
102 }
103 }
Hash 表的更多相关文章
- hash表长度优化证明
hash表冲突的解决方法一般有两个方向: 一个是倾向于空间换时间,使用向量加链表可以最大程度的在节省空间的前提下解决冲突. 另外一个倾向于时间换空间,下面是关于这种思路的一种合适表长度的证明过程: 这 ...
- 6.数组和Hash表
当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-i ...
- PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]
catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...
- hash-1.hash表和hash算法
1.hash表 哈希表,也叫散列表,是根据关键码(Key)而直接访问的数据结构,也就是它把Key映射到表中一个位置来访问记录,即,把key计算成hashcode,把hashcode存到表中.这个把ke ...
- Hash表算法
出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...
- HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...
- STL之map应用 +hash表(51nod 1095)
题目:Anigram单词 题意:给出词典,再给出一些单词,求单词的Anigram数量. 思路:先将字串转换成哈希表,然后再用map链接. hash表构造方法汇总:http://www.cnblogs. ...
- 深入了解STL中set与hash_set,hash表基础
一,set和hash_set简介 在STL中,set是以红黑树(RB-Tree)作为底层数据结构的,hash_set是以哈希表(Hash table)作为底层数据结构的.set可以在时间复杂度为O(l ...
- 【转载】一步一步写算法(之hash表)
转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaox ...
- HASH表原理(装)
HASH表原理 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找.而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的 ...
随机推荐
- CPU密集型和IO密集型与线程池的配置
CPU密集型任务应配置尽可能小的线程,如配置CPU数目+1个线程的线程池.由于IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程,如2*CPU数目.
- openEuler22.09初始化脚本
#!/bin/bash s=`nmcli d | grep "已断开" | awk '{print $1}'` echo /etc/sysconfig/network-script ...
- 音速启动 Vstart 5.7 win10手动移除后台设置主页
Vstart 用了快12年了,用Wireshark跟踪确实会访问广告页面,也会去上传数据.还会悄悄设置主页 ,所以在Win10上老是被干掉 也想着换 CLaunch 确实不喜欢. Rolan 买了一年 ...
- #Python #OpenCV 使用Python为你的圣诞节增添更多乐趣
目录 1.前言 2.目标与效果展示 3.下载OpenCV图形识别库 4.下载python支持的v2模块 5.图片素材 6.代码 1.前言 编辑 Merry Christmas!今天是2022 ...
- 用bcftools将多个vcf文件合并成一个vcf文件 或将多个vcf和合并成的vcf文件拆分成单个样本的vcf文件
1. 软件的安装 a. bcftools 的安装 b. bgzip的安装: https://blog.csdn.net/weixin_30471065/article/details/95108525 ...
- JS计算加减乘除出现多位小数的解决方法
function add(arg1, arg2){ let decima1, decima2, differ, m; try { decima1 = arg1.toString().split('.' ...
- linux查看所有的用户和组信息
1.cat /etc/passwd 查看所有用户 2.cat /etc/passwd|grep 用户名,用于查找某个用户 3.cat /etc/group查看所有组信息 4.cat /etc/g ...
- 《Linux就该这么学》这本书写得真好,我很喜欢。
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- 熟悉Hadoop及其操作 3
启动hdfs 查看与创建hadoop用户目录. 在用户目录下创建与查看input目录. 将hadoop的配置文件上传到hdfs上的input目录下.运行MapReduce示例作业,输出结果放在ou ...
- 【技术指北】通过SMB协议在iOS和Windows之间传输文件
windows操作 新建文件夹 设置文件夹的属性,选择共享 设置高级共享,权限选择完全控制 选择共享,选择Everyone cmd - ipcofig,获取ipv4地址 iOS操作 打开文件管理器 选 ...