1.学习内容#
主要学习内容为线性数据结构和离散化。知识点有:
- 队列,栈,链表
- 双向队列,双向链表
- 单调队列,单调栈
- 离散化,Hash
2.知识小结#
(1)队列,栈,链表:
基础的知识就不过多赘述。队列和栈的实现比较容易,链表中指针的操作需要好好理解,实现起来也不会困难。个人认为STL中的队列,栈,链表不宜滥用,它们的时间复杂度较高,但它们使用比较方便,两种方式都应该掌握。
(2)双向队列,双向链表:
双向队列是一种双向开口的连续线型空间,可以在队首和队尾进行插入和删除元素的操作。双向队列用STL中的dqueue实现比较方便。
双向链表的指针域有两个指针,分别指向前驱和后继,可以很方便的访问前驱和后继节点。操作也和普通的链表类似,比较好学。
(3)单调队列,单调栈:
单调队列和单调栈是队列(栈)中元素递增或递减的结构。“单调”可以说是一种思想,可以通过维护队列(栈)中元素的单调性来去除多余状态。举个例子:求数列中给定长度区间内的最小值。可以通过维护队列的单调递增,来去除多余的状态,而区间的最小值则是队列在区间上的首元素。
(4)离散化,Hash:
数据的离散化是一种处理大数据的方式。通过映射,保留数据的一些性质(我们所研究的性质),将大数据映射为小范围内的数据,从而降低后续操作的复杂度。如10000,9999,1,0 这四个数,如果我们只研究它们的相对大小,我们就可将它们映射为4,3,2,1 。而这个过程的实现比较复杂,但STL给了我们极大的方便,我们可以通过使用STL简短的完成这一过程。代码如下:
sort(sub, sub + n); //将数据排序,确定相对大小。
int size = unique(sub, sub + n) - sub; //去重函数,去掉重复元素。size为操作后元素个数。
for(int i = 0; i < n; i++)
a[i] = lower_bound(sub, sub + size, a[i]) - sub; //赋给数据离散化后的值
Hash可以说是一种空间映射函数。构造函数常见的方法有:直接寻址法,平方取中法,除留余数法,折叠法。Hash冲突是指:有两个及多个元素映射到同一位置,即Hash值相等。处理Hash冲突的常见方法有:链地址法,开放定址法。(有关Hash的内容有很多,就不作详细的介绍了)
3.题目归纳
- 链表:lg1996 约瑟夫问题
- 栈: lg1165 日志分析
- 队列: lg1683 逛画展
- 双向链表: lg1160 队列安排
- 单调队列: bzoj 1012 最大数maxnumber
- 单调栈: poj2559 Histogram
- 离散化:NOI2015 程序自动分析机
- Hash: lg3370 【模板】字符串哈希