`
128kj
  • 浏览: 600319 次
  • 来自: ...
社区版块
存档分类
最新评论

哈希表,开放地址法之线性探测代码(JAVA)

阅读更多
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)

    在Java中实现开放地址法中的双哈希代码,我们可以创建一个哈希表类,包含以下核心方法: 1. `put(key, value)`: 插入键值对。首先计算初始位置,如果该位置已存在元素,使用双哈希策略找到下一个空位置。 2. `get...

    C语言开放地址法哈希表构建

    本项目聚焦于C语言实现开放地址法的哈希表,这是一种解决哈希冲突的方法。 **哈希表简介** 哈希表是由数组和哈希函数共同组成的。哈希函数将键转换为数组下标,使得在理想情况下,每个键都能直接定位到数组中的唯一...

    开放地址法java代码

    开放地址法是一种解决哈希冲突的基本方法,常用于哈希表的设计与实现。在Java编程中,使用开放地址法可以创建高效的数据结构,快速进行数据查找、插入和删除操作。以下将详细介绍开放地址法的基本原理,以及如何用...

    数据结构中哈希表的实现代码

    在实际编程中,常见的哈希表实现如Python的内置`dict`类型、Java的`HashMap`以及C++的`std::unordered_map`,它们都提供了高效的键值对操作。这些库通常已经优化了哈希函数和冲突解决策略,使用者无需关心底层细节。...

    哈希表相关操作实现

    常见的冲突解决策略有开放寻址法(线性探测、二次探测、双哈希等)和链地址法(每个数组元素连接一个链表,存储映射到同一索引的键值对)。 4. **插入操作**:当向哈希表中插入一个新的键值对时,首先通过哈希函数...

    哈希表实现简单说明-附代码

    哈希表是一种高效的数据结构,它通过特定的哈希函数将键...例如,Python中的`dict`类型、Java的`HashMap`和C++的`std::unordered_map`都是哈希表的典型实现。理解哈希表的工作原理和优化策略对于提升程序性能至关重要。

    哈希表的原理 数据结构

    解决哈希冲突的方法有很多种,如线性探测法、链地址法、开放地址法等。不同的解决方法会对哈希表的性能产生不同的影响。 哈希表广泛应用于各种领域,如数据库、 searched engine、缓存系统等。 Java 中的 HashTable...

    数据结构 哈希表 哈希算法

    哈希表,也被称为散列表,是数据结构中一种高效的数据存储和检索工具。它通过哈希函数将数据的关键字映射到...例如,`hashTest`这个文件可能包含了相关的测试代码,你可以通过阅读和运行这些代码来加深对哈希表的理解。

    自定义哈希表的性能评测

    常见的处理冲突策略有开放寻址法(如线性探测、二次探测、双哈希探测)和链地址法(每个哈希槽存储一个链表)。每种方法都有其优缺点,例如开放寻址法在负载因子较高时性能下降明显,而链地址法则需要额外的空间来...

    哈希表的实现

    另外,双散列和开放定址的变种如线性探测再散列、二次探测再散列也是常用策略。 3. **动态扩容**:当哈希表中的元素数量过多,导致冲突频繁时,通常需要对哈希表进行扩容。扩容通常会创建一个新的更大的哈希表,并...

    数据结构课程设计哈希表设计问题.doc

    - **系统分析及设计思路**:分析哈希表的基本原理,包括哈希函数的构造,以及如何处理哈希冲突(开放寻址法、链地址法等)。设计思路可能包括选择合适的哈希函数,确定冲突解决策略,以及考虑如何优化存储和查找...

    LinearProbingHash:使用哈希表的线性探测实现

    在实际应用中,Java的`HashMap`类使用了开放寻址和链地址法的混合策略,而非简单的线性探测。但在理解和学习哈希表的原理时,线性探测哈希是一个很好的起点,有助于深入理解数据结构和算法的精髓。

    B+树,哈希表等JAVA版本的JAR包

    3. Java中的`HashMap`类就是哈希表的典型实现,提供了线性探测再散列和拉链法解决冲突。 jdbm-1.0这个库也可能包含了对哈希表的实现,使得在Java中可以高效地处理数据存储和检索。 在实际应用中,B+树和哈希表各有...

    据结构课程设计实验报告之源程序的相似性.docx

    在哈希表的实现中,使用了线性探测再散列法处理哈希冲突。当一个关键字的哈希值与已有的关键字冲突时,会在线性探测的过程中寻找下一个空位。`Hashfind`函数中,我们首先尝试在初始的哈希位置放置关键字,如果冲突,...

    哈希表经典讲解+各项优化+分析

    这可能涉及到线性探测、二次探测或双哈希等策略。 2. **链地址法**:在每个哈希桶内使用链表连接所有映射到该位置的元素,这样即使多个元素哈希到同一位置,也能通过链表进行后续操作。 3. **再哈希法**:使用另一个...

    哈希表学习笔记.docx

    常见的策略包括线性探测法(从冲突位置开始,依次向后查找直至找到空位置)。 - 优点:不需要额外的空间来存储链接列表。 - 缺点:可能会出现“聚集”现象,即某些区域特别密集,而其他区域则较为稀疏。 2. **连...

    课程设计报告试验报告-哈希表的设计实现分析.doc

    开放地址法则是当碰撞发生时,通过某种探测序列(如线性探测、二次探测或双哈希探测)寻找下一个空槽位。 报告可能还涵盖了冲突解决策略的实现、哈希表的扩容和缩容机制、以及性能评估等方面。在实际实现中,可能...

    java语言线性开行寻址散列源代码

    根据提供的信息,我们可以总结出...该Java程序实现了基于线性探测的哈希表操作,包括哈希表的构建、元素的插入、查找及删除等功能。通过对上述代码的分析,可以深入了解线性探测的基本原理及其在实际编程中的应用方式。

    JAVA-hash-table.zip_Table_hash_hash table java_java hash 查找_哈希表设

    (1) 建立一个哈希表,哈希函数为除留余数法,处理冲突的方法为线性探测再散列或二次探测再散列。 (2) 往哈希表中依次存入插入多个单词。 (3) 显示哈希表的存储情况。 (4) 计算哈希表的平均查找长度。 (5) ...

Global site tag (gtag.js) - Google Analytics