今天依旧是讲数据结构。讲了单调栈,单调队列,哈希,并查集。
单调栈、单调队列:是由于存放按照“先进先出”或先进后出顺序出现,但又需要控制单调性的数据。
单调栈:是指一个内部元素具有严格单调性的栈,分为单调递增栈和单调递减栈。性质:满足栈先进后出的特性,满足从栈顶到栈底的元素具有严格的单调性。元素进栈过程:假设要一个单调递增栈,若当前进栈的元素为a如果a<栈顶元素则直接将a进栈,假如a>=当前栈顶元素则不断将栈顶元素出栈直到满足a<栈顶元素。
单调队列:是指一个内部的元素具有严格单调性的队列,分为单调递增队列和单调递减队列。性质:满足队列先进先出的特性,满足从队头到队尾的严格单调性。元素进队列过程:假设要一个单调递增队列,对于一个将入队的元素a如果a>队尾元素那么直接入队尾,如果a<=队尾元素,两种方案,将队尾元素出队列,直到满足a大于队尾元素,或者直接清空队列,按需要选择。
哈希:是把关键字k的记录放在f(k)的存储位置上,就是h[f(k)]=d[k]。当f[k]不适合作下标时用哈希(k是一个字符串或一个大范围内的随机数);哈希常用方法:1.f(k)=k%p(p是一个满足空间复杂度要求的大质数);2.按全展开法转化为对应的十进制数,在转化过程中同时利用取模。当下标冲突时可以用线性探测开拓地址法:当h[f[k]]已经有数值填入的时候尝试填入h[f[k]+1]……直到找到一个空位填入。拉链法:为哈希表每一个位置创建一个链表,利用链表的特性快速扩充哈希储存空间。
哈希函数:
int f(int K)
{
int k;
k=对K做取模、按位权展开等处理。
return k;
}
并查集:(集合是若干个具有共性的元素相互联系在一起,组合起来。不同的集合可以合并)并查集是一种快速合并集合和查找集合的算法。
初始化:
for(int i=1;i<=n;i++)
f[i]=i;
判断数据所属集合:
int find(int x)
{
if(f[x]==x)
return x;
else
{
f[x]=find(f[x]);
return f[x];
}
}
集合合并:
f[find(x)]=find(y);