福州Day4之数据结构(下)
今天的内容可谓是惊天地泣鬼神啊!!!真如无字天书,武陵秘籍,人教版语文书(最后这个错了。(lll¬ω¬))……一个字也没听懂……咳咳!!可这阻挡不了我写博客的热情(好假)……怀着这样一颗炙热的心,开始今天的课堂整理
1) 并查集
集合:若干个具有某种共性的元素互相联系在一起,组合起来,就是集合。
而并查集顾名思义,就是一种用于快速“合并集合”和“查找集合”的算法。
【特点】
1. 每个集合都有一个代表元,代表元即代表该集合。
2. 每个集合内的元素都以树形的结构储存下来。
3. Father数组:记录树形结构中结点的父亲
【初始化操作】
【判断数据所属集合】
不断查找当前节点的祖先:
但是这样的操作浪费巨大!!!(*Φ皿Φ*)
所以我们可以进行路径压缩,第一次查询以后加查询的该节点直接放到最后查询到的根结点下即可。
【集合合并】(关键点来啦!!!(p≧w≦q))
只要将这两个集合的任一代表元的父亲修改为另一代表元就好啦。(有点草率哈(lll¬ω¬)
2) 树状数组
树状数组是一种支持数据的快速求前缀和算法。只记录二进制上具有关联的数据的前缀和算法。多在需要求前缀和时更改数据时用。
【区别】
树状数组不同于普通前缀和的地方在于不记录连续的所有数据的和,而是跳跃地记录数据和。这个跳跃间隔同时适用于查询前缀和时向前跳跃和修改数据后的向后跳跃。
【计算移动距离】
可以很简便的通过x&(-x)来求得x的二进制表示,只保留最后一位。
【求前缀和】
将所有当前位置上将记录到的数字和没记录到的数字都记录下来。
每次往前跳跃lowbit(x),直到最前。
【动态修改】
只要把增量同步到所有记录了这个位置数据的位置上即可。
【初始化】
3) 线段树
线段树和树状数组类似,出现对数列进行区间操作(求和,求最值等特征值,数据)时可以考虑线段树。
【根据数据建树】
【查询区间特征值】
根据递归向下查找。
【更新点】
递归!!!
【适合区间,更有效的线段树写法】
优化修改,调整查询。
为每个节点添加一个lazytag标签,记录当前区间的孩子是否需要修改,并记录改动值的大小,以便后续同步。
4) MAP
5) KMP
百度优先搜索)(就是如此草率(′д` )…彡…彡)