java 中的哈希映射_使用Java中的哈希表实现通用映射

发布详情

在数据结构课程中,我获得了一个“二次探测哈希表”类的Java源代码,并要求实现一个通用映射(使用get和put方法)并将这些键/定义对存储在一个哈希表中。我在阅读本书时理解这些内容,但发现很难用编程语言(Java)来实现。我认为问题的一部分是确切地理解问题的要求,部分是Java编程体验的不足之处。我希望能得到一些关于如何处理这类问题的建议,并填写我错过的任何Java知识。

一些问题我已经

散列表类与我应该创建的通用映射有什么关系?散列表有几种方法,包括get,insert,remove,rehash等...散列表的目的是生成一个散列值用作映射类中的一个键吗?密钥和定义存储在散列表中还是将它们存储在地图中?如果哈希表已经完成了所有这些工作,那么制作地图有什么意义呢?

有人能帮助我理解如何解决这样的问题吗?什么是一些可能对我有帮助的参考,或者是专门针对这个问题,或者是对如何有效和有条理地完成这种练习的理解?

我很感激我能得到的任何帮助。我包括书中的代码以帮助说明问题。

从教科书中二次探测哈希表代码

public class QuadraticProbingHashTable {

public QuadraticProbingHashTable() {

this(DEFAULT_TABLE_SIZE);

}

public QuadraticProbingHashTable(int size) {

allocateArray(size);

doClear();

}

public boolean insert(AnyType x) {

int currentPos = findPos(x);

if(isActive(currentPos)) return false;

array[currentPos] = new HashEntry<>(x, true);

theSize++;

if(++occupied > array.length / 2) rehash();

return true;

}

private void rehash() {

HashEntry[] oldArray = array;

allocateArray(2 * oldArray.length);

occupied = 0;

theSize = 0;

for(HashEntry entry : oldArray)

if(entry != null && entry.isActive) insert(entry.element);

}

private int findPos(AnyType x) {

int offset = 1;

int currentPos = myhash(x);

while(array[currentPos] != null && !array[currentPos].element.equals(x)) {

currentPos += offset;

offset += 2;

if(currentPos >= array.length) currentPos -= array.length;

}

return currentPos;

}

public boolean remove(AnyType x) {

int currentPos = findPos(x);

if(isActive(currentPos)) {

array[currentPos].isActive = false;

theSize--;

return true;

} else return false;

}

public int size() {

return theSize;

}

public int capacity() {

return array.length;

}

public boolean contains(AnyType x) {

int currentPos = findPos(x);

return isActive(currentPos);

}

public AnyType get(AnyType x) {

int currentPos = findPos(x);

if(isActive(currentPos)) return array[currentPos].element;

else return null;

}

private boolean isActive(int currentPos) {

return array[currentPos] != null && array[currentPos].isActive;

}

public void makeEmpty() {

doClear( );

}

private void doClear() {

occupied = 0;

for(int i = 0; i < array.length; i++) array[i] = null;

}

private int myhash(AnyType x) {

int hashVal = x.hashCode();

hashVal %= array.length;

if(hashVal < 0) hashVal += array.length;

return hashVal;

}

private static class HashEntry {

public AnyType element;

public boolean isActive;

public HashEntry(AnyType e) {

this(e, true);

}

public HashEntry(AnyType e, boolean i) {

element = e;

isActive = i;

}

}

private static final int DEFAULT_TABLE_SIZE = 101;

private HashEntry[] array;

private int occupied;

private int theSize;

private void allocateArray(int arraySize) {

array = new HashEntry[nextPrime(arraySize)];

}

private static int nextPrime(int n) {

if(n % 2 == 0) n++;

for(; !isPrime(n); n += 2) ;

return n;

}

private static boolean isPrime( int n ) {

if(n == 2 || n == 3) return true;

if(n == 1 || n % 2 == 0) return false;

for(int i = 3; i * i <= n; i += 2)

if(n % i == 0) return false;

return true;

}

}从教科书映射骨架

class Map {

public Map()

public void put(KeyType key, ValueType val)

public ValueType get(KeyType key)

public boolean isEmpty()

public void makeEmpty()

private QuadraticProbingHashTable> items;

private static class Entry {

KeyType key;

ValueType value;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值