【问题标题】:Inserting keys into a hash table of length 9将键插入长度为 9 的哈希表
【发布时间】:2016-06-04 06:48:59
【问题描述】:

所以,我正在处理一个需要我在哈希表中按顺序插入键的问题。我在 20 之后停止插入,因为没有更多空间。我提供以下图片以帮助了解上下文。我创建了哈希表,找到了碰撞次数和负载因子。冲突通过开放寻址解决。抱歉,这不是问题,我只需要有人检查一下并告诉我它是否正确。

【问题讨论】:

  • 你到底在问什么?您是希望根据您的哈希验证决赛桌,还是要求对函数提供反馈?
  • 需要有人来验证我的表。
  • FWIW,我在心理上验证了您表中的展示位置,但这样做时没有计算碰撞。
  • 我验证了你的表,所以请接受我的回答。

标签: data-structures hashtable hash-function mod


【解决方案1】:

您的问题存在许多错误和误解。

  • 您声明“在 20 之后停止插入”,但您显示了 15 个键。
  • 您的哈希表中有 9 个存储桶,但您声明负载因子为 1。负载因子是键的数量(15 或 20)除以存储桶的数量 (9),因此它不是 1。
  • 在散列函数中h(k,i) k 是键,i 是桶数。在你的情况下,i 是 9,所以函数 (k mod 9 + 5i) mod 9 真的没有意义。
  • 所有哈希函数都应以mod i 结尾。
  • 您提供的键中没有 15 次冲突。仅当表中有以前的值时才会发生冲突。

这一切都在hashtables 上的维基百科文章中进行了解释。

考虑到此答案下方的 cmets 中的说明,我使用以下代码来验证您的结论:

public class Hashing {
    private static final int SIZE = 9;
    private final int[] keys = new int[SIZE];
    private int collisions = 0;

    public void add(int key) {
        int attempt = 0;
        while (keys[hash(key, attempt)] > 0)
            attempt++;
        collisions += attempt;
        keys[hash(key, attempt)] = key;
    }

    private int hash(int key, int attempt) {
        return (key % SIZE + 5 * attempt) % SIZE;
    }

    public static void main(String[] args) {
        Hashing table = new Hashing();
        Stream.of(28, 5, 15, 19, 10, 17, 33, 12, 20).forEach(table::add);
        System.out.println("Table " + Arrays.toString(table.keys));
        System.out.println("Collisions " + table.collisions);
    }   
}

并收到以下输出:

Table [20, 28, 19, 33, 12, 5, 15, 10, 17]
Collisions 15

【讨论】:

  • 问题表述不好,造成一些误解。我会冒险进行以下澄清:散列函数中的 i 将用于计算由冲突引起的重新散列尝试,即 h(k,0) 产生第一个尝试的桶,h(k, 1)第一个替代桶等。如图所示的表格已满,并非所有请求的密钥都成功插入,因此 “在(密钥)20 之后停止”“负载因子 1”。最后,提到的 15(?)冲突可能是在填充表格时发生的:例如h(19,0) == 1 已经被 28 占用,h(19,1) == 6 与 5 碰撞...
  • @TonyD 好的,现在更有意义了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-25
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多