一个月的数据结构小结

差不多十多天的数据结构学习。
在此做一个小结。

1 首先是是线性查找内。

主要是两种 哈希和trie树

此类数据结构主要是对于快速查找的时候使用。作为一种储存已知信息,然后在运用的时候尽量可以能在o(n)的时间之类可以访问到。

 

1.1 首先是trie树、二十六叉树 应该是对此结构的最好理解。

由于每个节点都含有26个字母指针。

所以此结构在储存字母的时候可以相对(对于普通储存)节约很多空间。而且可以进行模式匹配。(但是事实上trie特别消耗内存)


trie主要的操作创建,插入,查询;

而trie的以内拓展主要是建立在他在查询的时候可以进行修改操作。而且树的结点一般就是一个权值点(也就是属性值),所以查到最后就可以得到所需要的属性。

在做的过程中有这样几个问题,开始时动态与静态的建树,回收与不回收,后来经测试最好是静态建树。如果是动态的话。不回收(回收时一个特别容易错的地方)内存会超大。回收又浪费时间。不值得。

 

trie还常常结合搜素 。一边构造一般搜索,一次节约时间。

这里需要注意的就是trie的删除。这个地方网上很多地方有疏漏,对此讲的不是很细。因为考得不是很多,poj 2954 这道有删除操作。

 

1.2 hash .

 1.2.1  数字类型的hash 主要用模除运算; 可以用位运算 x& m (m为素数) 节约时间。、

 1.2.2  字母类型的hash 其实差不多。现在一般用的是ELFhash .

 上述hash 遇到冲突 。主要采用的是 链表来解决(数组模拟链表)。

hash 有些时候也可以作为离散化用。

 

2 二叉树 

由于是二叉所以很节约时间。 然后又一系列的衍生结构。感觉都是建立在这个基础上的。

 

2.1 二叉搜索树(bst)

主要还是 在节点处储存一些性质(左边的为比他小的,右边的比他大)。通过在遍历整个二叉树的时候来解决问题。

当燃 整个遍历也会有考点,遍历的不同最后也可以做一些表达式类的问题。

2.2 堆

堆其实感觉就是一种二叉树。只是其 顶节点 非常特别。顶节点为问题所求的最优解  比如 最小堆 顶节点是最小值。 而优先队列则是顶点得到 下一个最优值。这也是为什么优先队列可以优化动规 等一些问题。时间复杂度 也 因为是 二叉树 log(n)

 

2.3 线段树(堪称一绝)(配合离散化和扫描线运用)

线段树其实也是二叉类的树。只是节点上面 有一个区间范围 因此大大扩展了他的操作性。主要对于大量的数据可以进行区间操作 因此来节约时间。自然复杂度是log(n),

线段树 十分灵活  建树,插入,查找,修改,删除。这些都是很灵活变通的。

可以解决,区间连续性问题。加法。矩阵面积周长。rmq,  很多很多。

好的线段树的 节点属性必须设置的十分恰当。 常常会因为属性过多而更新会出问题。所以属性要既少又好。

线段树还有一个节约时间是查到某一区间后就返回。而每次往下查找的时候,通过父节点的状态记录跟新子节点。

然后回溯上升的时候通过子节点根新父节点。

但是需要注意常常有些问题 会因为只跟新到父节点,而某些问题解决不了。所以也会牺牲时间代价跟新到最底层。

 

线段树能优化dp也是靠他找到区间的最优值,然后最优值还可以修改,因此很节约时间。

(线段树容易错的地方 , 第一层和最后一层 不满足你所要的传递关系需要特判。 传递与更新很容易想错)

 

2.4 树状数组(拓展二叉树)

树状数组因为快速遍历修改,可以大大的节约时间。减少一些非必要的遍历。创造此结构的堪称 位运算的神人。

但是因为他的结构使他也只能做加法类的问题。但是高手可以通过转换问题来 发挥树状数组的强大问题。(见noi 某年题)

 

2.5 归并线段排序树

没什么特别。综合的归并排序的性质,在归并的时候又建立线段树。在每个线段        树上又进行排序。所以每个线段的上都是有序数列。建树需要   n*log(n);查找需要log(c)*logn*logn 次c为查找的长度.n为总字符   串的长度。用来写过区间第k小。其实有其他的解决方法。

 

3 。队列 和 栈,扫法(小结构也可以发挥强大的功能)

再次复习一下这几个数据结构,深度有所加深。

队列(循环队列,双端队列)。因为它是 FIFO 所以可以用来累积可能的最优解。 然后依次处理。 用法很多 kruskal. 斜率优化等等。

栈 FIFO  也可以储存最优解,只是不同于队列是  栈是改变现在的最优解与前一步的,而队列是加入往后再处理

他们能起到如此功能。我觉得主要的原因在于是线性的, 每一个元素都只是进出 栈(队列)都是是一次。 所以只用扫一遍就是了

而扫法。就是靠两个指针使前后元素进行对比来线性找出结果。

 

4 图的数据结构

4.1 并查集。

最原始的并查集,就是连通两个相同关系的点。这样就可以把图分成几块。相当于set一样。

而并查集的真正强大之处在于,带上权值以后,任何节点都可以和在一起。通过他们的权值来确定他们的关系,这样并查集可以大大发挥作用。而且加上路径压缩了以后他的查找时间也大大降低,所以并查集可以在 lca 中运用 ,连通分量自然也可以,还有很多。

 

并查集实现起来很简单,但要灵活运用是需要经验积累的。。。其实说穿了,并查集中的集合就是相互间已经建立起某种联系的元素的集合,比如某个家族的所有成 员就构成了一个集合;如果两个元素属于不同的集合,那么他们之间一定没有关系; 假如这两个元素产生了某种关系(这就好比两个人结婚了)那么这两个集合中的所有元素之间也必然相应的建立起了联系,接下来为了分析问题的必要,就必须把这 两个集合合并起来union 。

 

4.2 邻接表,前向星。

这写主要是储存图的时候用,要结合图算。这几天也只写过一两次。今后图论的时候加强。

 

5 RMQ 和 LCA

RMQ很多都能做,后缀数组,线段树。只是st算法比较快而已。

LCA 写了离线的算法,自然里面有并查集的运用。

 

数据结构没有好坏,正像柯神说的那样。要灵活自如,随心所欲的运用才是王道。数据结构应与所选择的算法相适应。数据结构是为算法服务的。 一个好的数据结构应该是配合算法而运用。 达到优化时间,空间,解决问题的目的。


 

一下是我还应该加深的数据结构。 trie的变形后缀树,和trie图, splay(只学了一半 不成熟), bst,treap(三选一 ) ,左边树 (合并堆),二维线段树,LCA用RMQ的转化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值