学习小结(一) —— 基础数据结构

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 【模板】字符串哈希
posted @ 2018-01-23 19:34  CrazyDave  阅读(79)  评论(0编辑  收藏  举报