数据结构与算法之哈希算法 开放寻址法实现 线性探测 / Java 示例

数据结构与算法阿木 发布于 4 天前 1 次阅读


开放寻址法实现哈希算法:线性探测的Java示例

哈希表(Hash Table)是一种基于哈希函数将键映射到表中的位置的数据结构。它提供了快速的查找、插入和删除操作。哈希算法是实现哈希表的核心,其中开放寻址法是哈希算法的一种。本文将围绕开放寻址法中的线性探测方法,通过Java代码示例来展示其实现过程。

开放寻址法是一种解决哈希冲突的哈希表实现方法。当哈希函数计算出的哈希值已经存在数据时,线性探测法会从该位置开始,依次探测下一个位置,直到找到一个空位为止。本文将详细介绍线性探测法的原理,并通过Java代码实现一个简单的哈希表。

线性探测法原理

线性探测法的基本思想是:当哈希函数计算出的哈希值对应的数组位置已经被占用时,线性探测法会从该位置开始,依次探测下一个位置,直到找到一个空位为止。如果整个数组都被占用,则表示哈希表已满。

线性探测法的优点是实现简单,查找效率较高。但缺点是当哈希表较满时,可能会出现“聚集”现象,导致查找效率降低。

Java实现

下面是使用线性探测法实现的Java哈希表代码示例:

java

public class HashTable {


private int size;


private int capacity;


private String[] table;

public HashTable(int capacity) {


this.capacity = capacity;


this.size = 0;


this.table = new String[capacity];


}

// 哈希函数


private int hash(String key) {


int hash = 0;


for (int i = 0; i < key.length(); i++) {


hash = 31 hash + key.charAt(i);


}


return hash % capacity;


}

// 插入元素


public void insert(String key) {


int index = hash(key);


while (table[index] != null) {


index = (index + 1) % capacity;


}


table[index] = key;


size++;


}

// 查找元素


public boolean search(String key) {


int index = hash(key);


while (table[index] != null) {


if (table[index].equals(key)) {


return true;


}


index = (index + 1) % capacity;


}


return false;


}

// 删除元素


public void delete(String key) {


int index = hash(key);


while (table[index] != null) {


if (table[index].equals(key)) {


table[index] = null;


size--;


return;


}


index = (index + 1) % capacity;


}


}

// 打印哈希表


public void printTable() {


for (int i = 0; i < capacity; i++) {


if (table[i] != null) {


System.out.println("Index " + i + ": " + table[i]);


}


}


}


}


测试代码

下面是测试上述哈希表的Java代码:

java

public class Main {


public static void main(String[] args) {


HashTable hashTable = new HashTable(10);


hashTable.insert("apple");


hashTable.insert("banana");


hashTable.insert("cherry");


hashTable.insert("date");


hashTable.insert("elderberry");

System.out.println("Search 'banana': " + hashTable.search("banana"));


System.out.println("Search 'grape': " + hashTable.search("grape"));

hashTable.delete("banana");


System.out.println("Search 'banana' after deletion: " + hashTable.search("banana"));

hashTable.printTable();


}


}


总结

本文介绍了开放寻址法中的线性探测方法,并通过Java代码实现了线性探测哈希表。线性探测法是一种简单且高效的哈希表实现方法,但在哈希表较满时可能会出现聚集现象。在实际应用中,可以根据具体需求选择合适的哈希表实现方法。