Hash其实就是一个优化过的桶,而这种优化是用玄学的 %\%% 运算实现的。
我来直观的讲一讲这个玩意。
就以排序来说,如果最大数是longlong范围,而个数是20000000,HASH就可以将桶排的空间复杂度 O(1∗longlong)O(1*long long )O(1∗longlong) 优化成 O(大于20000000的模数)O\text{(大于20000000的模数})O(大于20000000的模数)。(我这样写对不对?)由于模数越大,得到的余数种类也就越多,在一定在大于数据个数的时候,它的余数种类一定是够塞的。(如果两个数模后余数相同,还有其他的空位够它塞,因为余数个数大于数据个数)。也就是说,用 hashhashhash 就相当于把桶排那些用不到的位置都给节约了。
我们先选择一个模数,这个模数最好应该是质数,这样能防止重复。并且这个模数还应该满足比数据总数大,越大越好,这样比较优,(但是我怀疑会较低%\%%运算的速度)。(还有,千万不要用长者的生日,出题人一般都会恶意卡掉。)
然后,建立一个数组,我们叫它 h[n]h[n]h[n] ,根据情况,我们选择是否需要记录元素个数,如果需要,那么就建一个结构体。
struct node
{