阿西哈希函数的设计
看下面的一组数据,如果是用红黑二叉树进行存储,性能在O(longn),但是如果将这些数字直接放到内存中,比如这组数据中最大的是940,那就开辟一个940的大小的内存,每个数字都在对应的位置上,数字本身就是在内存上的索引,这样的话查找数据的话时间复杂度为O(1),但是这损失了空间。
为了解决上面的问题,可以通过取余来解决:比如将正整数与一定的数M进行相除,比如100,那么所得的余数便作为他们的键值,这样内存的开销就会小了很多,但是也会出现取余之后出现数字相同的情况,这叫哈希冲突,不能解决,只能避免。
素数: 就是除了1和它自身外,再没有其它因子的自然数。如果把1也看作一个特殊的素数,写出来素数的集合为{1,2,3,5,7,11,13,17,19,23,......}
为了避免上述情况M最好为素数,比如97。 可以看到分步更为均匀了,但是还是无法避免哈希冲突。
当然你不可能只存储正整数,可能还有浮点数和字符串,比如下面字符串也是转为二进制,其中a的ASCII码为97,b的ASCII码为98,c的ASCII码为99,但是你调用内置的GetHashCode函数得到的结果很可能与左边算的不一样,这是因为内部实现上不一样,不必管。