哈希表是一种数据结构,提供快速的插入和查找功能。哈希表基于数组存储数据,因此能在O(1)时间内定位数据。关键字值通过哈希函数映射为数组下标。缺点就是数组创建后容量固定,如果数据较多需要不断扩展其长度。如何将关键字转换为数组下标?这个操作是通过哈希函数完成的。比如,下面就是一个简单的哈希函数,int hash(int key){return key % array.length;//通过取余,返回值数组下标}有时候,有些哈希函数对于不同的键值可能会生成相同的哈希码值。所以需要解决冲突问题,下面有两种方法:1.开放地址法:通过在哈希表中再找一个空位来解决此问题。此法又分为三种方法:1)线性探测,即上面使用的这种方法,哈希函数将关键字范围压缩到数组的范围,对数组长度取余即可,+1,+2,+3…以此类推进行取余。2)二次探测的过程是这样,+1,+2,+4,+9…以此类推。3)再哈希,用不同的哈希函数对关键字再做一次哈希化。2.链地址法:在哈希表每个单元中设置链表。某个数据项的关键值仍然映射到哈希表的单元中,而数据项本身插入这个单元的链表中其他同样映射到这个位置的数据项只需要加入到链表中。
package test;
public class HashTable {
Item[] hashArray;
int arraySize;//定义数组长度
public HashTable(int size){//构造器,初始化
arraySize = size;
hashArray = new Item[arraySize];
}
//哈希函数
public int hash(int key){
return key % arraySize;
}
//插入,这里假设是数组未满,即不能插入大于arraySize的数据数
public void insert(Item item){
int key = item.getKey();
int hashCode = hash(key);
//若已存在同样的数据,则向下进一位,直到找到空的位置
//为了简单,也可要求不准有重复数据
while(hashArray[hashCode] != null){
++hashCode;
hashCode %= arraySize;
}
hashArray[hashCode] = item;
}
//删除
public Item delete(int key){
int hashCode = hash(key);
while(hashArray[hashCode] != null){
if(hashArray[hashCode].getKey() == key){
Item temp = hashArray[hashCode];
hashArray[hashCode] = null;
return temp;
}
++hashCode;
hashCode %= arraySize;
}
return null;
}
//查找
public Item find(int key){
int hashCode = hash(key);
while(hashArray[hashCode] != null){
if(hashArray[hashCode].getKey() == key)
return hashArray[hashCode];
++hashCode;
hashCode %= arraySize;
}
return null;
}
//列出全部数据
public void show(){
for(int i=0;i<arraySize;i++){
if(hashArray[i] != null)
System.out.print(hashArray[i].getKey() + " ");
else
System.out.print("* ");
}
}
public static void main(String[] args) {
HashTable ht = new HashTable(10);
ht.insert(new Item(1));
ht.insert(new Item(2));
ht.insert(new Item(3));
ht.insert(new Item(4));
ht.insert(new Item(4));
ht.show();
Item i = ht.find(3);
System.out.println("i = "+i.getKey());
Item di = ht.delete(3);
System.out.println("di = "+di.getKey());
ht.show();
}
}
//定义哈希表中存放的数据类型,可以为任意的类型
class Item{
int idata;
public Item(int idata){
this.idata = idata;
}
public int getKey(){
return idata;
}
}
分享到:
相关推荐
Java数据结构 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构
数据结构(Java语言描述) 单元设计_单元8 哈希表.doc 学习资料 复习资料 教学资源
讲解哈希函数,哈希表的原理以及常用运算。 是常用的数据结构
java 实现常用数据结构(链表,集合,栈,哈希表,搜索,排序等).
数据结构学习笔记(5)——使用draw.io绘制的映射、哈希表和跳跃表图,详细绘制了映射、哈希表和跳跃表图,使用draw.io——免费开源的画图工具。
java java_leetcode面试题解哈希表第170题数据结构设计_题解
包含链表、 栈、 队列、优先级队列、哈希表,绝对原创总结!
哈希表的设计与实现。 有文档、源代码,数据结构的课程设计
包含了各种数据结构和算法(java)的实现方式和详解(图解),包括单双链表、环形链表(约瑟夫问题)、栈、后缀表达式、中缀表达式转后缀表达式、迷宫问题、八大排序算法、多种查找算法、哈希表、二叉树实现以及操作...
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用...
哈希表是一种使用哈希函数组织数据,以支持快速插入和搜索的数据结构。 有两种不同类型的哈希表:哈希集合(理解为set)和哈希映射(理解为dictionary)。 哈希集合是集合数据结构的实现之一,用于存储非重复值。 哈希...
《Java数据结构和算法》(第2版)介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和...
哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希表经典讲解+各项优化+分析哈希...
JAVA数据结构与算法课程第05课双端链表和双向链表.mp4JAVA数据结构与算法...哈希表.mp4JAVA数据结构与算法课程第16课开放地址法.mp4JAVA数据结构与算法课程第17课链地址法.mp4JAVA数据结构与算法课程第18课图的基本概念...
《Java数据结构和算法》(第2版)介绍了计算机编程中使用的数据结构和算法,对于在计算机应用中如何操作和管理数据以取得最优性能提供了深入浅出的讲解。全书共分为15章,分别讲述了基本概念、数组、简单排序、堆和...
赫夫曼编码及译码 二、实训的性质和任务 数据结构实训是在完成理论课程学习之后安排的综合实践训练,要求学生能根据数据 结构中所讲到的各种数据类型以及它们顺序和链式存储,在具体的应用中能运用并实现 各种数据...
介绍了计算机编程中使用的...《Java数据结构和算法》(第2版)提供了学完一门编程语言后进一步需要知道的知识。本书所涵盖的内容通常作为大学或学院中计算机系二年级的课程,在学生掌握了编程的基础后才开始本书的学习。
public class HashTabDemo { public static void main(String[] args) { HashTab hashTab = new HashTab(7); String key = ""; Scanner scanner = new Scanner(System.in); while (true){ ...
c语言数据结构 源代码 简单的操作
基于java语言编写了常见的数据结构计算法,包括栈与队列、哈希表、常见排序算法等