基于除留余数除法,模拟物理重力坠落余数机器过滤,直观呈现稀疏数轴向紧凑内存的高效压缩
哈希(Hash,散列)是一种空间压缩映射。它通过散列函数把一个庞大的数域(如 32 位带符号整型)压缩映射到一个较小的紧凑数组区间 $[0, M-1]$ 中,实现稳定 $O(1)$ 复杂度的插入与检索。
最主流的散列函数设计是除留余数法(Division Method)。对于任意整数键值 $key$,设哈希表大小为 $M$:
⚠️ 考点:C++ 负数取模修正
在 C++ 中,对于负数执行 % 取模时,结果仍为负数(如 -5 % 3 == -2)。因为哈希表索引必须是非负整数,所以必须通过以下数学变形保证结果稳定映射在 $[0, M-1]$ 区间内:
💡 模数 $M$ 的选取法则: 模数 $M$ 建议选取为与 $2^p$ 尽量远的质数(Primes)。若 $M$ 为合数(如 10),其约数容易导致哈希散列极度偏向特定桶槽,极易引发哈希碰撞冲突!
const int M = 7; // 哈希表大小(选择质数)
int hashTable[M];
bool occupied[M];
// 安全数值哈希映射函数(防负数溢出)
int getHash(int key) {
return (key % M + M) % M;
}
void insert(int key) {
int idx = getHash(key);
hashTable[idx] = key;
occupied[idx] = true; // 槽位被占用
}