【问题标题】:Hash table with double hashing collision resolution - infinite loop具有双哈希冲突解决方案的哈希表 - 无限循环
【发布时间】:2018-11-05 15:39:16
【问题描述】:

我一直在强调这个哈希表,但我似乎无法找到导致这些无限循环的原因。插入通常在一半左右停止。密钥由一串 64 个随机符号组成,中间用下划线分隔。需要帮助尝试调试它!

这里是 Table 构造函数,包括哈希函数和插入方法:

        private int maxsize;
        private int size;
        private TableEntry[] table;
        private int primeSize;

        public HashTable(int ts)
        {
            size = 0;
            maxsize = ts;
            table = new TableEntry[maxsize];
            for (int i = 0; i < maxsize; i++)
                table[i] = null;
            primeSize = getPrime();
        }

        public int getPrime()
        {
            for (int i = maxsize - 1; i >= 1; i--)
            {
                int fact = 0;
                for (int j = 2; j <= (int)Math.Sqrt(i); j++)
                    if (i % j == 0)
                        fact++;
                if (fact == 0)
                    return i;
            }

            return 3;
        }

        public void Insert(string key, double value)
        {
            if (size == maxsize)
            {
                Console.WriteLine("Table full");
                return;
            }
            int hash1 = myhash1(key);
            int hash2 = myhash2(key);
            Console.WriteLine(" Hashed keys: {0}, {1}", hash1, hash2);
            while (table[hash1] != null)
            {
                hash1 += hash2;
                hash1 %= maxsize;
            }
            table[hash1] = new TableEntry(key, value);
            size++;
        }

        private int myhash1(string key)
        {
            int hashVal = key.GetHashCode();
            hashVal %= maxsize;
            if (hashVal < 0)
                hashVal += maxsize;
            return hashVal;
        }

        private int myhash2(string key)
        {
            int hashVal = key.GetHashCode();
            hashVal %= maxsize;
            if (hashVal < 0)
                hashVal += maxsize;
            return primeSize - hashVal % primeSize;
        }

【问题讨论】:

    标签: c# hashtable infinite-loop double-hashing


    【解决方案1】:

    如果Insert 中的while 循环循环回到数组中的同一索引而没有找到空位,它可能会进入无限循环。为了防止这个问题,您可以使用“只找到下一个可用空间”策略来增加双散列策略 - 如果第一个策略失败,则切换到第二个策略。您需要另一个变量来跟踪 hash1 的原始值来实现它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多