哈希表浅谈
哈希表通俗来说是将数据以某种规则计算来取到一个关键值key,然后查找时直接通过关键值key直接找到数据,这样平均情况下时间复杂度为O(1)。但是因为规则并不是万能的,所以会使得不同的数据得出的关键值一样,产生冲突。解决冲突的方法有两种,一个方法是为冲突关键字在哈希表中寻找另一个位置,称开放寻址法,一个方法是把在相同位置的所有关键字都存储在一个“挂”在那个位置上的数据结构中,称封闭寻址法。
以我自己做过的例子来说,比较熟悉第二个方法中采用挂链法。具体实现方法是结合数组和链表,相当于创建一个链表数组,之后根据数据情况来设置规则,求出对应的关键值,然后进行存储。如果有两个或多个数据冲突的话,就将第一个放进那个单元的数据作为头结点,其余冲突的数据则依次往下,变成在链表中存储。但是如果冲突很多,那么必定会影响查找效率,这样就要进行rehash操作,那什么时候进行rehash操作,以及怎样rehash。确认这个时间点可以通过设置一个负载因子来解决,比如你的哈希表数组长度是m,但是你已经存储了n个数据,而n/m就为负载因子。从负载因子的大小中判断存储的数据是否有很多都冲突了,如果负载因子过大,就需要rehash。
之后是代码的编写:
package 哈希表0412;
import java.util.LinkedList;
public class myHashTable {
private int length=100;
private LinkedList<Student> array[]=new LinkedList[length];
private int count;
private int threshold=(array.length)*2;
//求取关键值key
private int getKey(String id){
int sum=id.hashCode();
int index=(sum)%(array.length);
return index;
}
//添加数据
public void add(Student st){
if(st.getId()==null){
throw new NullPointerException();
}
int index=getKey(st.getId());
if(array[index]==null){
LinkedList<Student> ll=new LinkedList<Student>();
ll.add(st);
array[index]=ll;
}else{
array[index].add(st);
}
if((count++)>=threshold){
rehash(2*array.length);
}
}
//查找数据
public Student get(String id){
int index=getKey(id);
//遍历链表
for(int i=0;i<array[index].size();i++){
if(array[index].element().getId()==id){
Student st=array[index].element();
// System.out.println(st);
return st;
}
}
return null;
}
//删除数据
public void remove(String id){
int index=getKey(id);
for(int i=0;i<array[index].size();i++){
if(array[index].element().getId()==id){
Student st=array[index].remove();
// System.out.println(st.getCourse());
}
}
}
public void rehash(int length){
count=0;
LinkedList<Student> arrayOther[]=new LinkedList[length];
}
}
以上代码中的rehash中,只是扩容了哈希表数组的范围,但我觉得只要重新定义一个取得关键值key的方法,应该就可以整个重新将数据放一次。不过新的规则还没想到...
最后还是要多动手写代码,可以实际操作一下。
分享到:
相关推荐
对一批关键字集合采用开放定址哈希表的存储结构来建立相应的哈希表和完成查找过程。 (1) 熟练掌握哈希表的构造方法 (2) 理解哈希表与其他结构表的实质性差别。
数据结构中的哈希表详细解析,有力与对数据结构的理解,更有利于对哈希表的理解,其中的是C语言
通过对哈希算法的演示,很快能理解哈希表的功能和作用
利用C++哈希表的方法实现电话号码查询系统 如何运用哈希表的算法 深刻理解哈希表 利用C++哈希表的方法实现电话号码查询系统 如何运用哈希表的算法 深刻理解哈希表
数据结构中的哈希表查找,代码有注释,理解算法后理解代码非常容易看懂
C语言课程设计报告-基于哈希表的二叉树优化,利用哈希表的查找性能优化二叉树的操作(比平衡二叉树性能更高),需要的小伙伴私信我,直接发链接给你。不用在CSDN上下载哈(你有VIP的话当我没说)。课程中不仅仅设计...
数组在Java中频繁使用,想到重要 包装类 理解String类和StringBuffer类 向量与哈希表
内容概要:通过带领读者感受哈希表的用途和魅力。了解几种解决哈希冲突的方式,以及字符串哈希这一特殊的哈希方式。 适用人群:对于学习过基础算法并且学习过c++的学者比较友好。 可以将哈希表应用到什么场景? 一:...
使用c语言实现了hashtable算法,可以用来作为新手学习,理解hashtable。理解linux内核中使用的hashtable
自己写的关于哈希表的代码。实现对本班同学的姓名进行哈希排序,查找。还有待完善。。不过能运行带注释好理解。希望给初学者带来帮助
VB 哈希表算法演示源码【高级版】,常规的(非优化的)VB代码的哈希运算.如果你想使用他们,你需要进一步的优化,以达到更快的效果.并搜集了了一些热门选择散列算法表.从256位开始,我们每个都进行论循计算(见左上)并以16...
主要介绍了C++ 实现哈希表的实例的相关资料,这里使用C++实现哈希表的实例帮助大家彻底理解哈希表的原理,需要的朋友可以参考下
libevent的哈希表使用方法,将原来libevent里的部分程序摘出来,方便理解。
有两种不同类型的哈希表:哈希集合(理解为set)和哈希映射(理解为dictionary)。 哈希集合是集合数据结构的实现之一,用于存储非重复值。 哈希映射是映射数据结构的实现之一,用于存储(key, value)键值对。 在标准模板...
第一题哈希表Python_Leetcode 在快速阅读了这本厚重的 Python 数据结构书后(强烈推荐给像我这样的编程“初学者”): 我首先开始使用我朋友建议的链表。 这并不难。 关于链表有一些总结或技巧: 然后是二分查找和两...
数据结构是计算机存储、组织数据的方式,它涉及到数据的逻辑结构、物理结构以及对数据的基本操作。...通过对数据结构的理解和运用,以及对算法的学习和研究,可以帮助我们更有效地解决实际问题,提升编程能力。
若学生对教材以外的相关题目较感兴趣,希望选作实验的题目时,应征得指导教师的认可,并写出明确的抽象数据类型定义及说明。 2. 实验前要作好充分准备,包括:理解实验要求,掌握辅助工具的使用,了解该抽象数据...
以下是一些常见类型的管理系统: 学校管理系统: 用于学校或教育机构的学生信息、教职员工信息、课程管理、成绩记录、考勤管理等。学校管理系统帮助提高学校的组织效率和信息管理水平。 人力资源管理系统(HRM):...