【问题标题】:Hash Table Collisions Conceptual哈希表冲突概念
【发布时间】:2013-12-06 21:02:03
【问题描述】:

我正在尝试创建一个 method 来计算哈希表中发生的冲突次数。我会检查整个table,看看有多少buckets 有超过1 个element

草稿:

 public int getCollisions() {
 int counter = 0;
 for (int i = 0; i < buckets.length; i++) {
     if (buckets.length > 1) {
         counter += i;
     }
 }
 return counter;
 }

【问题讨论】:

  • 是的。这就是我会做的。实际上,您会在每个桶长度大于 1 时增加一个计数器。所以,if (bucket.length &gt; 1) { counter += bucket.length; }
  • 我可以提出一个草稿方法供您检查@Elliott Frisch 吗?
  • draft方法不是添加碰撞次数,而是添加bucket的索引。
  • 那会是 buckets.length,类似于 Elliot 的帖子吗?
  • 看我的答案(特别是代码后面的那位),但基本上是的,而且你的 if 语句条件也有问题。

标签: java hashtable collision


【解决方案1】:

我可能会用这个 -

public long getCollisions() {
  long counter = 0;
  for (int i = 0; i < buckets.length; i++) {
    if (buckets[i].length > 1) {
      counter += buckets[i].length; // 2 (or more) items collided in this bucket.
    }
  }
  return counter;
}

【讨论】:

  • 由于某种原因我无法做到buckets[i].length,长度不应该是默认方法吗?
【解决方案2】:

您添加的是存储桶的索引,而不是计数器的碰撞次数。试试这个:

public int getCollisions() {
    int counter = 0;
    for (int i = 0; i < buckets.length; i++) {
        if (buckets[i].length > 1) {
            counter += buckets[i].length-1;
        }
    }
    return counter;
 }

这里我假设如果一个桶中有 n 个对象(其中 n>1),那么该桶中有 n-1 个碰撞。如果我的假设不正确,那么只需删除 -1,它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 2020-10-21
    • 1970-01-01
    • 2012-02-19
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多