实现一个哈希表,首先我们要知道哈希表可以干什么,包含什么方法,实现哪些功能。
哈希表又叫散列表,是根据关键码值(Key, value)而直接进行访问的数据结构。oracle文档里面提到,用哈希表进行检索和存储,key首先要完成hashcode方法,以确定这个key属于哪个区间,也就是说具有相同hashcode的被放在同一块区间里,hashcode往往是取模得出的结果。
确定了位置,我们还要解决冲突问题,如果表中已经存在当前要存的key,我们应该先删除以前的那个key,先后把新的key加入到表中,这里我们要做两步,判断是否存在相同的key,如果存在就删除以前的key,注意的是这里说的key实际上是<key, value>对。
实现代码如下
import java.util.LinkedList;
public class HashDemo<K, V> {
private final int MAX_SIZE = 50;
LinkedList<Element<K,V>>[] items;
public HashDemo() {
items = new LinkedList[MAX_SIZE];
}
/* 官方实现hashcode代码
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
*/
public int hashCodeOfKey(K Key) {
return Key.toString().length() % items.length;
}
public void put(K key, V value) {
int h = hashCodeOfKey(key);
if(items[h] == null)
items[h] = new LinkedList<Element<K,V>>();
//检查当前的key是否已经存在
LinkedList<Element<K, V>> coll = items[h];
for(Element<K,V> e : coll) {
//如果存在就删除以前的元素
if(e.equivalent(key)) {
coll.remove(e);
break;
}
}
//把新的元素加到表中
Element<K, V> element = new Element<K, V>(key, value);
coll.add(element);
}
public V get(K key) {
int h = hashCodeOfKey(key);
if(items[h] == null) {
return null;
}
LinkedList<Element<K, V>> coll = items[h];
for(Element<K,V> e : coll) {
if(e.equivalent(key))
return e.getValue();
}
return null;
}
}
//Element类帮助我们处理表中的元素
class Element<K, V> {
private K key;
private V value;
public Element( K key, V value) {
this.key = key;
this.value = value;
}
public boolean equivalent(K k) {
return key.equals(k);
}
public K getKey() {
return key;
}
public V getValue() {
return value;
}
}
参考资料:Cracking the Coding Interview,Gayle Laakmann McDowell
分享到:
相关推荐
问题描述: 设计哈希表实现电话号码查找系统。 基本要求: (1)设每个记录有下列数据项:电话号码、用户名、地址; (2)从文件中读取各记录,分别以电话号码和用户名为关键字建立不同的哈希表; (3)采用链地址法...
设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 (1)记录由外部输入。 (2)生成的哈希...
C语言设计哈希表实现图书查找系统,完成相应的建表和查表程序。从键盘输入各图书相关信息,分别以图书编号为关键字建立散列表。待填入哈希表的书号至少30个;构造合适的哈希函数。 1) 记录由外部输入。 2) 将生成...
在这个特定的C++程序中,哈希表被用来实现一个数字排序算法,特别是针对大整数范围内的数据。程序的目标是处理多组测试数据,每组数据包括两个整数n和m,以及n个在[-500000, 500000]区间内的整数。使用哈希表可以...
C语言基于哈希表实现通讯录 在本文中,我们将探讨使用C语言基于哈希表实现通讯录的方法。哈希表是一种高效的数据结构,能够快速地存储和查找数据。在本文中,我们将通过设计和实现一个通讯录系统,来展示哈希表的...
### 哈希表实现与电话号码查询:深入解析与C语言代码分析 #### 哈希表基础知识 哈希表是一种数据结构,它通过使用哈希函数将键(key)映射到值(value)的存储位置,从而提供快速的数据访问能力。哈希表在理想情况...
数据结构的课程设计 哈希表实现电话号码查询系统
哈希表是一种高效的数据结构,它通过特定的函数(哈希函数)将数据映射到一个固定大小的数组中,从而实现快速的插入、查找和删除操作。在本项目"用C++实现的电话号码查询系统"中,哈希表被用来存储电话号码及其对应...
在压缩包中的"hash表学习"文件中,可能包含了关于哈希表实现的具体代码示例,包括哈希函数的定义、冲突解决策略的实现以及插入、查找和删除操作的算法。通过阅读和理解这些代码,你可以更深入地了解哈希表的实际应用...
(1)每个人的信息至少包括姓名,...(2)假设人名为汉语拼音全拼形式,待插入哈希表的长度为你所在班级的人数。哈希函数用除留余数法构造,采用链地址法或二次探测再散列法解决冲突。 (3)完成菜单设计。操作有必要的提示。
数据结构课程设计C++基于哈希表实现的通讯录系统源码+课程设计报告(高分项目).zip代码完整,报告全面,下载即用。 数据结构课程设计C++基于哈希表实现的通讯录系统源码+课程设计报告(高分项目).zip代码完整,...
设计哈希表实现电话号码查询系统,不仅锻炼了数据结构的应用能力,也提升了问题解决和编程技能。通过这个项目,可以深入理解哈希表的工作原理,以及如何通过再哈希法解决冲突。此外,对于用户输入的处理、错误检查和...
总结来说,这个电话号码查询系统通过哈希表实现了高效的记录存储和检索。哈希函数的设计和再哈希策略确保了冲突的最小化,使得数据查找和插入的时间复杂度接近O(1)。通过结构化的程序设计,用户可以方便地管理、查询...
《哈希表实现电话号码查询》 在计算机科学中,数据结构是编程的基础,而哈希表作为一种高效的数据结构,广泛应用于各种信息查询系统。本报告主要探讨如何使用哈希表来实现电话号码的快速查询,以满足对学生信息管理...
本文为大家分享了C语言基于哈希表实现通讯录的具体代码,供大家参考,具体内容如下 1.需求分析 本演示程序用C语言编写,完成哈希表的生成,电话号码的插入、以及查找等功能。 (1)按提示输入相应的联系人的相关...
报告书主要围绕使用哈希表实现电话号码查询这一主题展开,涵盖了从需求分析、系统设计到实现和总结的全过程。以下是相关知识点的详细说明: 1. **哈希表(Hash Table)**:哈希表是一种数据结构,它通过计算一个...
总之,C++中的哈希表实现涉及到哈希函数设计、冲突解决策略的选择以及相关的插入、查找和删除操作。通过`HashTest.cpp`和`Hashtable.h`,我们可以深入理解这些概念,并通过实际代码来学习和测试哈希表的功能和性能。
哈希表是一种高效的数据结构,它通过特定的算法——哈希函数,将任意大小的键(key)映射到一个固定大小的数组中,从而实现快速查找、插入和删除操作。在C语言中,实现哈希表需要理解其基本原理,并掌握如何利用...