第五天

由 Zoupers 发布

突然难度就提升了,还好都能懂,不然今天写不动了-.-

区间查询(Range queries)

区间查询是一种给定一组数据,查找这个数组的一个子数组的某些性质的问题,比如查询子数组的和、最小值、最大值。

第一节首先介绍了静态查询,这是一种离线算法,可以通过构造前缀和数组来完成常数时间的子数组和查询。但是针对最小值(最大值)的查询,则是构建了一个记录数组,这个构造呢...还是看书吧,这个思想还是蛮有意思的。

第二节介绍了一种只能用于子数组和查询的数据结构,Binary indexed tree(树状数组,这是查的翻译...),这个数组的结构非常巧妙,基本思想其实可以说是来源于第一节种的查询最小值,另外在奇偶校验码当中也有使用,而且这几个联合起来领会可以发现这种技巧真的很厉害。

第三节介绍了Segment tree(线段树),这个数据结构适用于所有的区间查询。而且不止离线,在线查询也可以。只有两个操作,分别是更改值和查询,具体操作和实现可以看书。这个线段树还可以用来具体定位我们查询所对应的元素,比如说精确查找最小值的位置。

第四节介绍了一些其他技术,第一个是索引压缩,这个我确实没看懂。不知道这个映射了有什么用,但是勉强觉得我们可以通过它来讲我们的存储分开。第二个是区间更新,具体看书,大致就是每次更新一堆值,每次只查一个值。另外这个还引出了是否可以同时的高效处理区间查询和区间更新的问题,作者说28章会讨论...还有大概十多天,加油...

位操作(Bit manipulation)

一开始感觉很简单,然后笑容逐渐凝固。

比特操作可以说都是些技巧,一般用于进行状态压缩什么的。

第一节首先介绍位表示,另外强调了一下整数的运算中进位的问题,如果学过计算机组成原理的应该明白为什么会这样。

第二节介绍位的操作,并且介绍了一下这些操作的应用,一些用基本操作达到的获取信息的技巧,比如快速获取第k位的值、快速颠倒、快速取最大的1什么的。最后介绍了几个g++编译器提供的一些便捷的位统计函数。

第三节介绍通过二进制表示集合的子集,书上有具体代码,可以看看。

第四节介绍通过位运算优化算法。第一个是汉明距离的计算,可以直接用第二节介绍的位统计函数。第二个是计算符合条件的子网格,这里是通过状态压缩和位统计函数来达到优化的。

第五节介绍通过位运算来实现动态规划。举了三个实例,这三个实例都是解法复杂度比较高的问题,所以理解的时候可以只理解位操作做了什么工作,主要就是状态的表示,当中用了一些前面第二节提到的技巧,可以互做参考。


暂无评论

发表评论