链哈希表链接列表

时间:2016-11-16 02:38:29

标签: java hashtable chaining

我应该创建一个链式哈希表,将每个桶中的名称作为链表。我知道如何使用包含一个值的存储桶来执行此操作,但我不知道如何在每个存储桶中放置链接列表。我有一个名字和名字的人类以及哈希码类。我写了删除但我不知道如何将LinkedList放入方法。我也有一个bucketList类;这是我需要实现LinkedList的地方吗?如果我能得到关于删除或放置方法的内容的一些指示,我应该能够弄清楚如何完成剩下的工作。谢谢

    public class MyChainHashTable<K, V> {

private static final int BUCKET_COUNT = 10;

private BucketList[] buckets = new BucketList[BUCKET_COUNT];

private void remove(K key, V value) {
    int bucketIndex = key.hashCode(); //TODO
    int bucketsProbed = 0;

    while (!buckets[bucketIndex].isEmptySinceStart() && bucketsProbed < BUCKET_COUNT) {
        // if this bucket isn't empty, and it matches what we're looking for
        if (!buckets[bucketIndex].isEmpty()
                && buckets[bucketIndex].getElement().equals(value)) {
            buckets[bucketIndex].clear();
            return;
        }
        bucketsProbed++;
        bucketIndex++;
        bucketIndex %= BUCKET_COUNT;   // circle back to 0
    }
}

private boolean put(K key, V value) {
    return false;

}

private void showTable() {
    // old phone UI
    String[] keyBoard = {"1    ", "2 ABC", "3 DEF", "4 GHI", "5 JKL",
            "6 MNO", "7 PRS", "8 TUV", "9 WXY", "0    "};

}

2 个答案:

答案 0 :(得分:0)

我认为Chained HashTable实际上是HashTable的HashTable,它将您的哈希键映射到HashTable,这样当您发生关键冲突时就不必跳到桌面上。

你要求使用HashTable的LinkedLists而不是HashTable的HashTable来改变它。

在基本的HashTable中,您需要计算下一个索引,以便在遇到密钥冲突时进行尝试,基本上您使用bucketIndex %= BUCKET_COUNT;进行操作但使用链接的HashTable则不会这样做。您的数组不是将您的元素插入基础数组中的索引位置,而是一个HashTables数组(或者您的情况下是LinkedLists数组),并将元素插入到该集合中。

答案 1 :(得分:0)

因此,根据我收集的内容,您希望实现一个包含链接列表的哈希表。我也看到了这个评论

  

BucketList一般 - Rawsick

因此,让我尝试实现此数据结构的一部分。

让我们从BucketList开始。因为这听起来只是一个带有通用参数T的Bucket,它定义了桶和V,这是桶中的内容。我要将它重构为Bucket<T, V>

public class Bucket<T extends Colletion<V>, V> {
    private T bucket;

    public T add(V value) {
        return bucket.add(V);
    }
    // More functions here
}

现在是哈希表,

public class MyChainHashTable<K, V> {
    private static final int BUCKET_COUNT = 10;
    // Advisable to use a resizeable array here, like an ArrayList
    // No need for bucket count then
    private Bucket<LinkedList, V>[] buckets = new Bucket<>[BUCKET_COUNT];

    public V put(K key, V value) {
        int bucketIndex = key.hashCode() % BUCKET_COUNT;
        buckets[bucketIndex].add(V);
    }
    // More functions here
}

这是一个非常简单的哈希表方法,只有桶本身稍微复杂一点,因为存储桶可以以Java Collections框架中的任何类的形式存储值。

我建议阅读Java中几个流行的集合实现的源代码。您将更好地了解如何解决此类问题。

查看Google的Gauva图书馆。查看一些复杂的集合,如MultiMap,并了解它们如何实现它。