1

我一直在用这个哈希表强调一段时间,但我似乎无法找到导致这些无限循环的原因。插入通常在一半左右停止。密钥由一串 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;
        }
4

1 回答 1

1

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

于 2018-05-26T12:38:57.113 回答