离散化和hash的总结

NOIP过后终于发现暴力的重要性啦。。感觉今年NOIP暴力打得好有450+的机会,可是蒟蒻就是蒟蒻,老想搞正解结果炸了一堆题目。。

这几天再次复习啦离散化和hash准备去NOIP继续水暴力去,于是在学习啦MrH929大牛的博客是,蒟蒻决定自己写一个总结复习用。

离散优化是一种常见的高效数据结构,它通过建立数据与存储结构(数组)之间(不一定)一一对应的映射关系来达到对复杂数据的优化。

离散优化最重要的一点是建立映射,对于特殊的线段、点而言,这些映射可以是对一个区间的映射,即将某段线或者某块区域映射到数组里面去,从而在计算时降低时间复杂度。

Hash优化:是对于字符串和数字的一种优化方式。它通过将数据映射到数组内的某个元素从而达到节省空间的效果。

根据hash算法的不同,可能会引起数据的碰撞,即hash(key1)==hash(key2),会使得数据存储出现错误。有两个方法可以解决:

  1. 拉链法,将hash所对密码指向链表头,每次查找元素遍历整串链表,直到找到该元素为止(编程复杂度较高)

  2. 开地址法,当hash所对密码冲突时,将数据存入另外的位置(可以是下一个空位置,也可以是计算出的任意位置),当然如果使用线性开地址法,只要有一个数据碰撞,那么其余所有数据都很有可能进行至少一次碰撞,非常耗费时间。所以我们运用hash算出另一个位置并存储:

while(hashtable[ad]!=0){

   ad+=ad%3+1;//可以是异于主hash算法的另一hash算法

}

 

      通常Hash算法分为两个板块:

  1. 查找元素,hash(key)对应的不一定是目标元素,需要对目标进行搜索,推荐使用开地址法进行搜索

  2. 插入元素,与查找同理,在插入之前必须检查此元素是否已被插入,再用开地址法存入相应的地址

 

Hash可用的构造方法

  1. 直接定址

  2. 取模法

  3. 平均取中值

  4. 随机数

  5. 数字分析法,将最有代表特色的位置作为特征码

  6. 折叠法,将数拆分成几部分并求和

  7. 基数法,将低进制数当作高进制数转化为原进制的数,并进行分析,取特征码(两个进制之间应该是互质的关系)

 

不过这些方法还有折叠法和基数法没遇到过题目,以后有机会一定要水一波

你可能感兴趣的:(OI)