background info
-
requirement
1.编译处理中对变量管理:
实际是动态查找问题
2.是否可以把字符串转化为数字处理?
2.例二半序 :
某些item中存在某种顺序
eg 查找树,节点比其左子树大,但小于其右子树,但并非(二分查找)完全有序(全序)
(1)设计一个函数–>将对象映射成为较小数(即对象存储的位置)
(2)解决冲突 -
ADT
散列函数构造方法
数字关键字
字符关键字
1.如果直接计算’a’*324+‘b’*323+‘c’*32^2+‘d’*32+'e’所需要的乘法总次数是4+3+2+1=10次。
2.采用 (((‘a’*32+‘b’)*32+‘c’)*32+‘d’)*32+'e’的计算方法,乘法总次数是4次
3.xx32 : X<<5 (x左移5位即乘32)
(两者时间效率的差别?)
p取素数可以使数据集中的数等概率映射到哈希表中,降低冲突概率。
Q : 在除留余数法中,为什么p要取素数?
A : 观察一组有规律的数据集key = {0, k, 2k, 3k, 4k, 5k, 6k…}用除留取余法进行散列映射(这里认为k是一个素数)
(1) 若取模p为一个素数(p当然不为k,不然取素数就没有意义了),那么h(key)将在(0, 1, 2, … , p-1)上等概率映射
(2) 而p不为素数时,最糟糕的情况莫过于p为k的整数倍,不妨设p = nk,那么h(0) = h(nk) = h(2nk) = … = 0, h(k) = h((n+1)k) = h((2n+1)k) = … = k…
即:所有数据被等概率映射到了(0, k, 2k, … , (n-1)k)的位置,其它位置(1, 2, … , k-1)等都是空缺,这就造成了大规模的冲突