我现在要学习的数据结构和算法类对算法的工作原理有很多笔墨理解,但实际编码却很少。我是一个编程新手,所以对某些人来说这可能是一个愚蠢的问题。

从概念上讲,我了解散列以及使用不同方法的原因,但对如何编写此赋值却一无所知。

基本上,我们可以使用所需的任何源代码。本书中的代码是http://users.cis.fiu.edu/~weiss/dsaajava3/code/SeparateChainingHashTable.javahttp://users.cis.fiu.edu/~weiss/dsaajava3/code/QuadraticProbingHashTable.java

当使用这些代码中的任何一个时,我似乎都很难将密钥插入表中。我正在使用此块插入:

Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(99999);
for (int i = 0; i < 100; i++) {
    H.insert(""+randomInt);
}


这似乎并没有在表中实际插入任何内容,但是,尽管有很多插入,但是大小仍然保持不变。
另外,我也不知道如何确定需要多少探针。

最佳答案

Random randomGenerator = new Random();

for (int i = 0; i < 100; i++) {
    int randomInt = randomGenerator.nextInt(99999);
    H.insert(""+randomInt);
}


试试这个,您在坏地方有一行。

我的情况是:

/**
     * Method that performs quadratic probing resolution.
     * @param x the item to search for.
     * @return the position where the search terminates.
     */
    private int findPos( AnyType x )
    {
        int offset = 1;
        int currentPos = myhash( x );

        while( array[ currentPos ] != null &&
                !array[ currentPos ].element.equals( x ) )
        {
            currentPos += offset;  // Compute ith probe
            offset += 2;
            if( currentPos >= array.length )
                currentPos -= array.length;
        }

        return currentPos;
    }


如果我正确理解:
该方法正在执行探测,是吗?因此,您必须计算在两个选项中调用此方法的次数:重复和不重复。如果添加的当前元素重复且为两个整数,则使用一些标志。在此方法中,添加if用于检查标志并增加计数器之一。您将拥有许多探针。

编辑:


[LIN-np]:使用非原始表大小1000 [LIN-p]的线性探测:
原始表大小为1019的线性探测。请注意1019是
minPrime(1000),即大于1000的最小素数。
[QDR-p]:原始表大小为1019的二次探测[DBL-p]:
具有主表大小1019和冲突解决方案的双哈希
对素数进行哈希运算97。


您必须使用HashTable进行探测并测试探测量(平均值)。您在public class QuadraticProbingHashTable<AnyType>中具有二次探测算法。并且您必须将哈希表的长度设置为1019。在第一个练习中,您必须使用线性探测。因此,基本上,开始添加元素时,必须使用具有指定前提条件的HashTables。

这是linear probing algorithm

这是double hash alhorithm

您必须在哈希表中实现它,并检查将使用它多少次。我认为它将以某种方式显示它产生了多少次碰撞。快乐的编码。二次算法就完成了,只需要设置前提条件即可(硬编码起始值为1019)。

10-04 12:03