import java.io.*;
class DataItem { //数据
private int iData; // data item (key)
public DataItem(int ii) {
iData = ii;
}
public int getKey(){
return iData;
}
}
class HashTable{//数组实现的哈希表,开放地址法之线性探测
private DataItem[] hashArray; //存放数据的数组
private int arraySize;
private DataItem nonItem; //用作删除标志
public HashTable(int size) {//构造函数
arraySize = size;
hashArray = new DataItem[arraySize];
nonItem = new DataItem(-1); // deleted item key is -1
}
public void displayTable(){//显示哈希表
System.out.print("Table: ");
for(int j=0; j<arraySize; j++)
{
if(hashArray[j] != null)
System.out.print(hashArray[j].getKey() + " ");
else
System.out.print("** ");
}
System.out.println("");
}
//哈希函数
public int hashFunc(int key)
{
return key % arraySize;
}
//在哈希表中插入数据
public void insert(DataItem item){
int key = item.getKey(); // 获取数据的键值
int hashVal = hashFunc(key); // 计算其哈希值
while(hashArray[hashVal] != null && hashArray[hashVal].getKey() != -1){
++hashVal; // 插入位置被占,线性探测下一位置
hashVal %= arraySize; // 不让超过数组的大小
}
hashArray[hashVal] = item; // 找到空位后插入
}
//在哈希表中删除
public DataItem delete(int key) {
int hashVal = hashFunc(key); // 计算其哈希值
while(hashArray[hashVal] != null){
if(hashArray[hashVal].getKey() == key){
DataItem temp = hashArray[hashVal]; // 记录已删除的数据
hashArray[hashVal] = nonItem; // 删除它
return temp;
}
++hashVal; // 到下一单元找
hashVal %= arraySize;
}
return null; // 没有找到要删除的数据
}
//在哈希表中查找
public DataItem find(int key) {
int hashVal = hashFunc(key); //哈希这个键
while(hashArray[hashVal] != null) { // 直到空的单元
if(hashArray[hashVal].getKey() == key)
return hashArray[hashVal]; // 找到
++hashVal; // 去下一单元找
hashVal %= arraySize; // 不让超过数组的大小
}
return null; // 没有找到
}
}
public class HashTableApp{//测试
public static void main(String[] args) throws IOException {
DataItem aDataItem;
int aKey, size, n, keysPerCell;
System.out.print("Enter size of hash table: ");
size = getInt();
System.out.print("Enter initial number of items: ");
n = getInt();
keysPerCell = 10;
HashTable theHashTable = new HashTable(size);
for(int j=0; j<n; j++){
aKey = (int)(java.lang.Math.random() * keysPerCell * size);
aDataItem = new DataItem(aKey);
theHashTable.insert(aDataItem);
}
while(true){
System.out.print("Enter first letter of ");
System.out.print("show, insert, delete, or find: ");
char choice = getChar();
switch(choice){
case 's':
theHashTable.displayTable();
break;
case 'i':
System.out.print("Enter key value to insert: ");
aKey = getInt();
aDataItem = new DataItem(aKey);
theHashTable.insert(aDataItem);
break;
case 'd':
System.out.print("Enter key value to delete: ");
aKey = getInt();
theHashTable.delete(aKey);
break;
case 'f':
System.out.print("Enter key value to find: ");
aKey = getInt();
aDataItem = theHashTable.find(aKey);
if(aDataItem != null)
{
System.out.println("Found " + aKey);
}
else
System.out.println("Could not find " + aKey);
break;
default:
System.out.print("Invalid entry\n");
}
}
}
public static String getString() throws IOException{
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = br.readLine();
return s;
}
public static char getChar() throws IOException
{
String s = getString();
return s.charAt(0);
}
public static int getInt() throws IOException
{
String s = getString();
return Integer.parseInt(s);
}
}
运行:
C:\java>java HashTableApp
Enter size of hash table: 20
Enter initial number of items: 10
Enter first letter of show, insert, delete, or find: s
Table: ** ** ** 143 24 85 166 ** ** 89 30 ** ** ** 34 15 ** 17 ** 59
Enter first letter of show, insert, delete, or find: d
Enter key value to delete: 89
Enter first letter of show, insert, delete, or find: s
Table: ** ** ** 143 24 85 166 ** ** -1 30 ** ** ** 34 15 ** 17 ** 59
Enter first letter of show, insert, delete, or find: f
Enter key value to find: 17
Found 17
Enter first letter of show, insert, delete, or find:
源码下载:
分享到:
相关推荐
在Java中实现开放地址法中的双哈希代码,我们可以创建一个哈希表类,包含以下核心方法: 1. `put(key, value)`: 插入键值对。首先计算初始位置,如果该位置已存在元素,使用双哈希策略找到下一个空位置。 2. `get...
本项目聚焦于C语言实现开放地址法的哈希表,这是一种解决哈希冲突的方法。 **哈希表简介** 哈希表是由数组和哈希函数共同组成的。哈希函数将键转换为数组下标,使得在理想情况下,每个键都能直接定位到数组中的唯一...
开放地址法是一种解决哈希冲突的基本方法,常用于哈希表的设计与实现。在Java编程中,使用开放地址法可以创建高效的数据结构,快速进行数据查找、插入和删除操作。以下将详细介绍开放地址法的基本原理,以及如何用...
在实际编程中,常见的哈希表实现如Python的内置`dict`类型、Java的`HashMap`以及C++的`std::unordered_map`,它们都提供了高效的键值对操作。这些库通常已经优化了哈希函数和冲突解决策略,使用者无需关心底层细节。...
常见的冲突解决策略有开放寻址法(线性探测、二次探测、双哈希等)和链地址法(每个数组元素连接一个链表,存储映射到同一索引的键值对)。 4. **插入操作**:当向哈希表中插入一个新的键值对时,首先通过哈希函数...
哈希表是一种高效的数据结构,它通过特定的哈希函数将键...例如,Python中的`dict`类型、Java的`HashMap`和C++的`std::unordered_map`都是哈希表的典型实现。理解哈希表的工作原理和优化策略对于提升程序性能至关重要。
解决哈希冲突的方法有很多种,如线性探测法、链地址法、开放地址法等。不同的解决方法会对哈希表的性能产生不同的影响。 哈希表广泛应用于各种领域,如数据库、 searched engine、缓存系统等。 Java 中的 HashTable...
哈希表,也被称为散列表,是数据结构中一种高效的数据存储和检索工具。它通过哈希函数将数据的关键字映射到...例如,`hashTest`这个文件可能包含了相关的测试代码,你可以通过阅读和运行这些代码来加深对哈希表的理解。
常见的处理冲突策略有开放寻址法(如线性探测、二次探测、双哈希探测)和链地址法(每个哈希槽存储一个链表)。每种方法都有其优缺点,例如开放寻址法在负载因子较高时性能下降明显,而链地址法则需要额外的空间来...
另外,双散列和开放定址的变种如线性探测再散列、二次探测再散列也是常用策略。 3. **动态扩容**:当哈希表中的元素数量过多,导致冲突频繁时,通常需要对哈希表进行扩容。扩容通常会创建一个新的更大的哈希表,并...
- **系统分析及设计思路**:分析哈希表的基本原理,包括哈希函数的构造,以及如何处理哈希冲突(开放寻址法、链地址法等)。设计思路可能包括选择合适的哈希函数,确定冲突解决策略,以及考虑如何优化存储和查找...
在实际应用中,Java的`HashMap`类使用了开放寻址和链地址法的混合策略,而非简单的线性探测。但在理解和学习哈希表的原理时,线性探测哈希是一个很好的起点,有助于深入理解数据结构和算法的精髓。
3. Java中的`HashMap`类就是哈希表的典型实现,提供了线性探测再散列和拉链法解决冲突。 jdbm-1.0这个库也可能包含了对哈希表的实现,使得在Java中可以高效地处理数据存储和检索。 在实际应用中,B+树和哈希表各有...
在哈希表的实现中,使用了线性探测再散列法处理哈希冲突。当一个关键字的哈希值与已有的关键字冲突时,会在线性探测的过程中寻找下一个空位。`Hashfind`函数中,我们首先尝试在初始的哈希位置放置关键字,如果冲突,...
这可能涉及到线性探测、二次探测或双哈希等策略。 2. **链地址法**:在每个哈希桶内使用链表连接所有映射到该位置的元素,这样即使多个元素哈希到同一位置,也能通过链表进行后续操作。 3. **再哈希法**:使用另一个...
常见的策略包括线性探测法(从冲突位置开始,依次向后查找直至找到空位置)。 - 优点:不需要额外的空间来存储链接列表。 - 缺点:可能会出现“聚集”现象,即某些区域特别密集,而其他区域则较为稀疏。 2. **连...
开放地址法则是当碰撞发生时,通过某种探测序列(如线性探测、二次探测或双哈希探测)寻找下一个空槽位。 报告可能还涵盖了冲突解决策略的实现、哈希表的扩容和缩容机制、以及性能评估等方面。在实际实现中,可能...
根据提供的信息,我们可以总结出...该Java程序实现了基于线性探测的哈希表操作,包括哈希表的构建、元素的插入、查找及删除等功能。通过对上述代码的分析,可以深入了解线性探测的基本原理及其在实际编程中的应用方式。
(1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。 (5) ...