Hining by Chaining VS Double Probing

时间:2012-12-12 11:22:47

标签: java data-structures complexity-theory double-hashing

我想在Chaining和Double探测之间进行比较。 我需要在表大小为100的位置插入40个整数, 当我用纳米时间测量时间时(在java中) 我知道Double更快。 多数民众赞成因为在链接的插入方法中,我每次都创建LinkedListEntry, 它增加了时间。 怎么能让Chaining比Double探测更快? (这就是我在维基百科中读到的内容)

谢谢!

这是链接代码:

public class LastChain
{
    int tableSize;
     Node[] st;
    LastChain(int size) {
        tableSize = size;
        st = new Node[tableSize];
        for (int i = 0; i < tableSize; i++)
            st[i] = null;
    }

    private class Node
    {
        int key;
        Node next;
        Node(int key, Node next)
        {
            this.key   = key;
            this.next  = next;
        }
    }

    public void put(Integer key) 
    {
       int i = hash(key);
       Node first=st[i];
       for (Node x = st[i]; x != null; x = x.next)
          if (key.equals(x.key))
             { 
             return; 
              }

       st[i] = new Node(key, first);

    }


    private int hash(int key)
    {  return key%tableSize;
    }

      }
}

这是双重探测的相关代码:

public class HashDouble1 {
  private Integer[] hashArray; 

  private int arraySize;

  private Integer bufItem; // for deleted items

  HashDouble1(int size) {
    arraySize = size;
    hashArray = new Integer[arraySize];
    bufItem = new Integer(-1);
  }



  public int hashFunc1(int key) {
    return key % arraySize;
  }

  public int hashFunc2(int key) {
    return 7 - key % 7;
  }

  public void insert(Integer key) {
        int hashVal = hashFunc1(key); // hash the key
        int stepSize = hashFunc2(key); // get step size
        // until empty cell or -1
        while (hashArray[hashVal] != null && hashArray[hashVal] != -1) {
          hashVal += stepSize; // add the step
          hashVal %= arraySize; // for wraparound
        }
        hashArray[hashVal]  = key; // insert item
      }





}
以这种方式,Double中的插入比链接更快。 我该如何解决?

2 个答案:

答案 0 :(得分:1)

链接在高负载因子下效果最佳。尝试在100个表中使用90个字符串(不是一个好的位置选择整数)。

链接也更容易实现删除/删除。

注意:在HashMap中,无论链接是否被链接,都会创建一个Entry对象,而不是在那里保存。

答案 1 :(得分:0)

Java具有特殊的“功能”对象占用了大量内存。

因此,对于大型数据集(这将具有任何相关性),双重探测将是好的。

但首先,请将您的Integer []更改为int [] - &gt;内存使用量将是四分之一左右,性能会很好地跳跃。

但总是有性能问题:衡量,衡量,衡量,因为你的情况永远是特殊的。