一、文艺 二叉树 (来源:codevs 3303)
有n个数,这个序列依次是(1,2,…,n-1,n),每次翻转区间(l,r),输出翻转的最终结果。
思路:
1 、用树的话,如何做到区间反转?把需要反转的树放到一棵子树当中,令该子树的左右孩子对换即可;
2 、很自然,会想到用 layz 的思路优化时间;
3 、如果左右子树对调,这还是一棵“左 < 根 < 右”的树吗?显然,它完全不合。这使得这棵树不能用原先的 findip ,因为它不符“左 < 根 < 右”;所以,我们可以用 findshuzi 的思路来查询它的 ip 。线段树的操作 splay 不受影响。
4 、此题建树时才用了建伸展树的方法,为的是让树一开始达到最平衡的情况。如果执意要用旧版,也没问题。建树还有一点需要注意,它多建了两棵树 head 和 tail ,为的是能更方便操作。
总结: 这题打破了以往对伸展树的定义,成了一棵没有大小之分的伸展树,它利用“伸展树无论怎样翻转,中序(前序、后序)遍历不变”的性质,用findshuzi()的思想来查询值为x的 中序遍历 位置。所以,即使是不能按大小顺序排列的数据,也可以考虑伸展树;换句话说, 伸展树也可以记录没有大小之分的数据 。
代码:
#include
#include
#include
using namespace std;
int root;
int a[100010];
struct node
{
int c,f,d,son[2];
bool fz;
}tr[100010];int len=0;
void weihufz(int x)
{
tr[x].fz=false;
swap(tr[x].son[0],tr[x].son[1]);
tr[tr[x].son[0]].fz^=1;
tr[tr[x].son[1]].fz^=1;
}
void update(int x)
{
tr[x].c=1+tr[tr[x].son[0]].c+tr[tr[x].son[1]].c;
}
void rotate(int x,int w)
{
int f=tr[x].f;
int ff=tr[f].f;
int r,R;
R=f;r=tr[x].son[w];
tr[R].son[1-w]=r;
if(r!=0) tr[r].f=R;
R=ff;r=x;
if(tr[ff].son[0]==f) tr[R].son[0]=r;
else tr[R].son[1]=r;
tr[r].f=R;
R=x;r=f;
tr[R].son[w]=r;
tr[r].f=R;
update(f);
update(x);
}
void splay(int x,int rt)
{
while(tr[x].f!=rt)
{
int f=tr[x].f;
int ff=tr[f].f;
if(rt==ff)
{
if(tr[x].fz==true) weihufz(x);
if(tr[f].son[0]==x) rotate(x,1);
else rotate(x,0);
}
else
{
if(tr[f].fz==true) weihufz(f);//父亲先翻转
if(tr[x].fz==true) weihufz(x);//儿子再翻转
if(tr[ff].son[0]==f&&tr[f].son[0]==x){rotate(f,1);rotate(x,1);}
else if(tr[ff].son[1]==f&&tr[f].son[1]==x){rotate(f,0);rotate(x,0);}
else if(tr[ff].son[0]==f&&tr[f].son[1]==x){rotate(x,0);rotate(x,1);}
else if(tr[ff].son[1]==f&&tr[f].son[0]==x){rotate(x,1);rotate(x,0);}
}
}
if(rt==0) root=x;
}
int ins(int l,int r)
{
if(l>r) return 0;
len++;int now=len;
int mid=(l+r)/2;
int lc=ins(l,mid-1),rc=ins(mid+1,r);
if(lc!=0) tr[lc].f=now;
if(rc!=0) tr[rc].f=now;
tr[now].d=mid;tr[now].fz=false;
tr[now].c=tr[lc].c+tr[rc].c+1;
tr[now].son[0]=lc;tr[now].son[1]=rc;
return now;
}
int findip(int k)//findip 指的是找中序遍历第k的数的地址
{
int x=root;
while(1)
{
if(tr[x].fz==true) weihufz(x);
int lc=tr[x].son[0],rc=tr[x].son[1];
if(k<=tr[lc].c) x=lc;
else if(k>tr[lc].c+1){k-=tr[lc].c+1;x=rc;}
else break;
}
return x;
}
void fanzhuan(int l,int r)
{
int lc=findip(l-1),rc=findip(r+1);
splay(lc,0);splay(rc,lc);
int x=tr[rc].son[0];
tr[x].fz^=1;
}
void dfs(int x)//中序遍历
{
if(tr[x].fz==true) weihufz(x);
int lc=tr[x].son[0],rc=tr[x].son[1];
if(lc!=0) dfs(lc);//左
a[++len]=tr[x].d;//根
if(rc!=0) dfs(rc);//右
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
root=ins(0,n+1);
while(m--)
{
int l,r;
scanf("%d%d",&l,&r);
l++;r++;//+1是因为受到值为0的节点的影响
fanzhuan(l,r);
}
len=0;
dfs(root);
for(int i=2;i
二、 二逼平衡树 (来源:bzoj 3196)
有n个数,需要提供以下几种操作:
1.查询k在区间内的排名
2.查询区间内排名为k的值
3.修改pos位置上的数值为k
4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)
5.查询k在区间内的后继(后继定义为大于x,且最小的数)
思路:
1、如果用普通伸展树,那么会受到大小不是有序的问题的影响,1、2、4、5都很难完成;
2、于是,我们用一种更加高级的算法“树套树” 来解决。这题我们用线段树 套伸展树 ,其中线段树的作用是掌控伸展树,伸展树都是具有“左<根<右”的树,用于具体的查询。用通俗点的话来讲,这题中的每段线段树都吊着 一颗它管辖范围内的伸展树;
3、如何搭建起一棵线段树+__棵伸展树?
(1)先把线段树的框架搭好:对于每棵线段树而言lc=now*2,rc=now*2+1,管理范围(父亲的 l ,mid)或(mid+1,父亲的 r );
(2)每次新加入1个值,就往线段树里对应的位置塞,当然每段线段树它记录的是一棵伸展树的根,所以新加的值要加入(Splay_ins)这棵伸展树中去;
(3)这样,一棵+__棵的大树,就长好了。现在区间为(l,r)的线段树中,就有一棵有大小之分的 专管 l-r的伸展树了。
4、有了这样庞大的数据结构,我们就可以开始装逼了:
1.在包含k且不重叠的伸展树中查找统计小于k的数的个数,+1就是k的排名;
2.这是本题的难点。通过二分 0~ma 的排名,尝试是否合理;
3.凡是包含pos的伸展树全部删去原来的值,在插入一个值为k的值;
4.在包含k且不重叠的伸展树中重复查找前驱,取最大的前驱为k的前驱;
5.在包含k且不重叠的伸展树中重复查找后继,取最小的后继为k的后继。
总结: 如果一堆没有大小之分的数据偏要进行数据大小的处理,那么线段树 套 伸展树 乃是首选。有了这样的基础后,伸展树的插入、查找和删除操作都建立在线段树的特定区间上,也就是说,线段树管理范围 ,伸展树才是真正的主人,发挥着查询、更改 的重要作用 。
代码:(以Splay开头的是伸展树的操作,以SegTree开头的是线段树的操作 )
#include
#include
#include
using namespace std;
int ans;
int a[50010],root[4000005];//root[i]线段树编号为i的,所管理的伸展树的根
struct node
{
int f,d,c,son[2],n;
}tr[4000005];int len=0;
void Splay_add(int d,int f)
{
len++;
tr[len].d=d;tr[len].f=f;tr[len].c=tr[len].n=1;
tr[len].son[0]=tr[len].son[1]=0;
if(d1){tr[x].n--;Splay_update(x);}
else if(tr[x].son[0]==0&&tr[x].son[1]==0){root[now]=0;}
else if(tr[x].son[0]==0&&tr[x].son[1]!=0){root[now]=tr[x].son[1];tr[root[now]].f=0;}
else if(tr[x].son[0]!=0&&tr[x].son[1]==0){root[now]=tr[x].son[0];tr[root[now]].f=0;}
else
{
int p=tr[x].son[0];
while(tr[p].son[1]!=0) p=tr[p].son[1];
Splay_splay(now,p,x);
int R=p,r=tr[x].son[1];
tr[R].son[1]=r;
tr[r].f=R;
root[now]=R;tr[root[now]].f=0;
Splay_update(R);
}
}
int Splay_findqianqu(int now,int d)//x=d&&tr[x].son[0]!=0)
{
x=tr[x].son[0];
while(tr[x].son[1]!=0) x=tr[x].son[1];
}
else if(tr[x].d>=d) return -999999999;
return tr[x].d;
}
int Splay_findhouji(int now,int d)//x>d
{
int x=Splay_findip(now,d);Splay_splay(now,x,0);
if(tr[x].d<=d&&tr[x].son[1]!=0)
{
x=tr[x].son[1];
while(tr[x].son[0]!=0) x=tr[x].son[0];
}
else if(tr[x].d<=d) return 999999999;
return tr[x].d;
}
void SegTree_ins(int now,int l,int r,int x,int d)//在区间内插入值d
{
int mid=(l+r)/2;
Splay_ins(now,d);//该区间的伸展树插入值d
if(l==r) return ;
else if(x<=mid) SegTree_ins(now<<1,l,mid,x,d);
else SegTree_ins(now<<1|1,mid+1,r,x,d);
}
void SegTree_askrank(int now,int l,int r,int al,int ar,int d)//查询区间(al,ar)中小于值d的数的个数
{
int mid=(l+r)/2;
if(al<=l&&r<=ar)//若该线段树(l,r)在查询范围内
{
ans+=Splay_findrank(now,d);
return ;
}
if(al<=mid) SegTree_askrank(now<<1,l,mid,al,ar,d);
if(mid+1<=ar) SegTree_askrank(now<<1|1,mid+1,r,al,ar,d);
}
void SegTree_change(int now,int l,int r,int pos,int d)
{
int mid=(l+r)/2;
Splay_del(now,a[pos]);
Splay_ins(now,d);
if(l==r) return ;
if(pos<=mid) SegTree_change(now<<1,l,mid,pos,d);
else SegTree_change(now<<1|1,mid+1,r,pos,d);
}
void SegTree_askqianqu(int now,int l,int r,int al,int ar,int d)
{
int mid=(l+r)/2;
if(al<=l&&r<=ar)
{
ans=max(ans,Splay_findqianqu(now,d));
return ;
}
if(al<=mid) SegTree_askqianqu(now<<1,l,mid,al,ar,d);
if(mid+1<=ar) SegTree_askqianqu(now<<1|1,mid+1,r,al,ar,d);
}
void SegTree_askhouji(int now,int l,int r,int al,int ar,int d)
{
int mid=(l+r)/2;
if(al<=l&&r<=ar)
{
ans=min(ans,Splay_findhouji(now,d));
return ;
}
if(al<=mid) SegTree_askhouji(now<<1,l,mid,al,ar,d);
if(mid+1<=ar) SegTree_askhouji(now<<1|1,mid+1,r,al,ar,d);
}
int main()
{
int n,m,ma=-999999999;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ma=max(ma,a[i]);
SegTree_ins(1,1,n,i,a[i]);
}
while(m--)
{
int opt,l,r,pos,k;
scanf("%d",&opt);
switch(opt)
{
case 1:
{
scanf("%d%d%d",&l,&r,&k);
ans=0;
SegTree_askrank(1,1,n,l,r,k);
printf("%d\n",ans+1);
break;
}
case 2:
{
scanf("%d%d%d",&l,&r,&k);
int head=0,tail=ma,Ans;
while(head<=tail)
{
int mid=(head+tail)/2;
ans=1;
SegTree_askrank(1,1,n,l,r,mid);
if(ans<=k)
{
Ans=head;
head=mid+1;
}
else tail=mid-1;
}
printf("%d\n",Ans);
break;
}
case 3:
{
scanf("%d%d",&pos,&k);
SegTree_change(1,1,n,pos,k);
a[pos]=k;
ma=max(ma,k);
break;
}
case 4:
{
scanf("%d%d%d",&l,&r,&k);
ans=0;
SegTree_askqianqu(1,1,n,l,r,k);
printf("%d\n",ans);
break;
}
case 5:
{
scanf("%d%d%d",&l,&r,&k);
ans=999999999;
SegTree_askhouji(1,1,n,l,r,k);
printf("%d\n",ans);
break;
}
}
}
}
做完这两道伸展树的题后,我不禁感叹:伸展树真的太神奇了!
推荐:《伸展树—作用介绍》http://blog.csdn.net/a_bright_ch/article/details/72795172
你可能感兴趣的:(伸展树)
算法分类合集
weixin_30784945
算法分类合集ACM所有算法数据结构栈,队列,链表哈希表,哈希数组堆,优先队列双端队列可并堆左偏堆二叉查找树Treap伸展树并查集集合计数问题二分图的识别平衡二叉树二叉排序树线段树一维线段树二维线段树树状数组一维树状数组N维树状数组字典树后缀数组,后缀树块状链表哈夫曼树桶,跳跃表Trie树(静态建树、动态建树)AC自动机LCA和RMQ问题KMP算法图论基本图算法图广度优先遍历深度优先遍历拓扑排序割边
ACM算法分类(要学习的东西还很多)
还是太年轻
ACM所有算法数据结构栈,队列,链表哈希表,哈希数组堆,优先队列双端队列可并堆左偏堆二叉查找树Treap伸展树并查集集合计数问题二分图的识别平衡二叉树二叉排序树线段树一维线段树二维线段树树状数组一维树状数组N维树状数组字典树后缀数组,后缀树块状链表哈夫曼树桶,跳跃表Trie树(静态建树、动态建树)AC自动机LCA和RMQ问题KMP算法图论基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分
ACM算法目录
龍木
ACM所有算法数据结构栈,队列,链表哈希表,哈希数组堆,优先队列双端队列可并堆左偏堆二叉查找树Treap伸展树并查集集合计数问题二分图的识别平衡二叉树二叉排序树线段树一维线段树二维线段树树状数组一维树状数组N维树状数组字典树后缀数组,后缀树块状链表哈夫曼树桶,跳跃表Trie树(静态建树、动态建树)AC自动机LCA和RMQ问题KMP算法图论基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分
算法竞赛 常见算法数据结构总结
AlanCong
1.1基本数据结构1.数组2.链表,双向链表3.队列,单调队列,双端队列4.栈,单调栈1.2中级数据结构1.堆2.并查集与带权并查集3.hash表自然溢出双hash1.3高级数据结构1.树状数组2.线段树,线段树合并3.平衡树Treap随机平衡二叉树Splay伸展树*ScapegoatTree替罪羊树4.块状数组,块状链表5.*树套树线段树套线段树线段树套平衡树*平衡树套线段树6.可并堆左偏树*配
Splay(伸展树)的基本操作(c++)
chs_bilianment
平衡树 算法 数据结构 c++
Myfirstblog\color{white}{\rmMy\first\blog}Myfirstblog写给新手,大佬勿喷{\rm写给新手,大佬勿喷}写给新手,大佬勿喷目录前置知识Splay是什么支持的操作左旋右旋伸展基本操作前驱后继插入删除查某数排名查排名为x的数时间复杂度例题结语前置知识平衡树二叉查找树树上操作指针函数运用基础数学知识Splay是什么Splaytree(伸展树)是一种平衡树,
【Golang 数据结构与法算】 Splay 伸展树
luoluoluoya
算法 golang 数据结构 开发语言
GitHub完整代码代码实现//Packagetree伸展树:基于局部性原理,将被访问的数据亦步亦趋的伸展至根节点,并在伸展过程中对树进行折叠(降低树高,双层伸展)packagetreeimport("data-structures-and-algorithms/contract")//Splay伸展树typeSplaystruct{Bst}//NewSplay新建空伸展树funcNewSplay
红黑树的优势_AVL树、splay树(伸展树)和红黑树比较
weixin_39941792
红黑树的优势
AVL树、splay树(伸展树)和红黑树比较一、AVL树:优点:查找、插入和删除,最坏复杂度均为O(logN)。实现操作简单如过是随机插入或者删除,其理论上可以得到O(logN)的复杂度,但是实际情况大多不是随机的。如果是随机的,则AVL树能够达到比RB树更优的结果,因为AVL树的高度更低。如果只进行插入和查找,则AVL树是优于RB树的,因为RB树更多的优势还是在删除动作上。缺点:1)借助高度或平
数据结构实现之Splay伸展树
清文
算法第四版 数据结构 splay
SplayTree是二叉查找树的一种,它与平衡二叉树、红黑树不同的是,SplayTree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,SplayTree会将节点n旋转到树根的位置,这样就使得SplayTree天生有着一种类似缓存的能力,因为每次被查找到的节点都会被搬到树根的位置,所以当80%的情况下我们需要查找的元素都是某个固定的节点,或者是一部分特定的节点时,那么在很
Splay树 伸展树 洛谷P3369
Dog-Du
数据结构 c++ 算法
前言Splay的思想非常简单:把每次访问的节点旋转至根节点。这主要是基于一个思想:刚刚被访问的节点及其周围节点有更高概率再次被访问。这种思想很多算法都有应用:比如LRU,B树的一部分思想,磁盘页缓存。显然在旋转中,如果P为父亲节点,L为左孩子,那么P右旋之后,L就变成了父亲,即L向上走了一位。这就是Splay的思想方法。为什么叫伸展树呢?因为伸展树不注重深度,变成一条链是非常有可能的事情,花枝招展
【数据结构】详细解读 Splay Tree(附完整代码)
千鱼干
笔记 数据结构 算法 splay tree 二叉树 伸展树
详细解读SplayTree(伸展树)昨天在研究决策树时遇到了一种特殊的搜索平衡二叉树Splay,很感兴趣,今天下午就深入了解了一下这种树。前部分代码参考了书,后部分为原创,可能有误,敬请批评指正!文章目录详细解读SplayTree(伸展树)Splay树的介绍旋转(Rotate)旋转方式名词介绍:第一种:ZIG/ZAG第二种:ZIG-ZIG/ZAG-ZAG第三种:ZIG-ZAG/ZAG-ZIGSpl
【数据结构】Splay伸展树
Alex_SCY
数据结构 数据结构 c++ 算法
目录问题A:Splay——Ver.I问题B:宠物收养所(Splay——前驱后继操作)问题A:Splay——Ver.I题目描述输入第一行包含一个整数n,表示初始序列的长度。以下n行每行包含一个整数,描述初始的序列。接下来一行包含一个整数n,表示插入操作的数目。以下m行每行描述一个操作。接下来一行包含一个整数q,表示查询和删除操作的总数目,以下q行描述一个操作输出对于所有操作,输出正确的答案。样例输入
数据结构Note:伸展树(Splay Tree)
Mollnn
基础数据结构 高级数据结构-平衡树 数据结构 伸展树 Splay Tree 树形数据结构
基本思想:每个节点被访问时,使用旋转操作将其移动到根。旋转是自底向上的,因此需要设置父亲指针核心操作:伸展Splay(x)保持伸展树有序性的前提下,将元素x调整到树的根部单次双旋,分若干种情况讨论!p->fatherx==y->leftZig(x)x==y->rightZag(x)p->father(令p=x->father)x==p->leftp==p->father->leftZig(p)Zi
【数据结构】Splay树(伸展树)
Texcavator
数据结构 数据结构
前置知识二叉树就是一个长这样的树,树中每个结点都有一个父结点(除了根结点没有父结点)和最多两个子结点,每个结点的左儿子一定比它小,右儿子一定比它大。这棵树的先序遍历很容易知道就是:1234567(根左右)我们还可以从另一个角度理解先序遍历:把整棵树映射到x轴上,也就是把它压扁也就是这样:先序遍历从左到右读出来就可以了单旋:左旋/右旋口诀:左旋拎右左挂右,右旋拎左右挂左图示:codevoidzig(
高级搜索——伸展树Splay详解
EQUINOX1
java 前端 算法 c++ 数据结构 开发语言 排序算法
文章目录伸展树Splay伸展树Splay的定义局部性原理Splay的伸展操作逐层伸展双层伸展zig-zig/zag-zagzig-zag/zag-zigzig/zag双层伸展的效果与效率伸展树的实现动态版本实现递增分配器节点定义Splay类及其接口定义伸展操作左单旋右单旋右左/左右双旋伸展查找操作删除操作插入操作完整代码静态版本实现结点定义接口定义rotate操作splay操作find操作get_
平衡二叉树简介
Python之战
平衡二叉搜索树(Self-balancingbinarysearchtree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。最小二叉平衡树的节点总数的公式如下F(n)=F(n-1)+F(n-2)+1这个类似于一个递归的数列,可
[模版总结] - 树的基本算法1 - 遍历
Ben土豆
刷题上岸之路 算法数据结构模板 二叉树及BST 算法 java 数据结构
树结构定义一种非线性存储结构,具有存储“一对多”关系的数据元素集合种类GeneralTreeTrieB/B+树二叉树满/完满/完全二叉树完美BT:除了叶子结点外所有节点都有两个字节点,每一层都完满填充完全BT:除最后一层以外其他每一层都完美填充,最后一层从左到右紧密填充完满BT:除了叶子结点外所有节点都有两个字节点二叉搜索树BST平衡BST红黑树伸展树自平衡二叉查找树AVL替罪羊树线索二叉树霍夫曼
第八章 查找【数据结构】【精致版】
日星月云
数据结构与算法【精致版】 数据结构与算法
第八章查找【数据结构】【精致版】前言版权第8章查找8.1概述8.2基于线性表的查找8.2.1顺序查找**1-顺序查找.c**8.2.2折半查找**2-折半查找.c**8.2.3索引查找8.3基于树的查找8.3.1二叉排序树**3-二叉排序树.c**8.3.2平衡二叉树8.3.3B树和B+树8.3.4伸展树8.3.5红黑树8.4散列8.4.1哈希函数的构造方法8.4.2处理冲突的方法8.4.3哈希表
【数据结构】树家族
恭仔さん
数据结构 数据结构 树 AVL BST 红黑树 B树
目录树的相关术语树家族二叉树霍夫曼树二叉查找树BST平衡二叉树AVL红黑树伸展树替罪羊树B树B+树B*树当谈到数据结构中的树时,我们通常指的是一种分层的数据结构,它由节点(nodes)组成,这些节点之间以边(edges)相连。树的一个重要特性是它们具有一个根节点(root),它位于树的顶部,并且每个节点都有一个父节点(parent)以及零个或多个子节点(children)。树结构是一种非线性存储结
[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]
ikrvxt
# splay splay
文章目录引入概念全套模板变量声明update==rotate旋转==splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题:P3369【模板】普通平衡树题目code声明一下,许多代码的注解都在模板代码里面写了的,所以正文可能不会很多其次是splaysplaysplay很多操作treaptreaptreap我都已经详解过了,只需要掌握不一
学习笔记:Splay
tsqtsqtsq0309
学习 笔记 算法
Splay定义Splay树,或伸展树,是一种平衡二叉查找树,它通过Splay/伸展操作不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,能够在均摊O(logn)O(\logn)O(logn)时间内完成插入,查找和删除操作,并且保持平衡而不至于退化为链。Splay树由DanielSleator和RobertTarjan于1985年发明。结构节点维护信息xtotfa[i]ch[i][0
学习笔记:Splay
tsqtsqtsq0309
学习 笔记 算法 数据结构
Splay定义Splay树,或伸展树,是一种平衡二叉查找树,它通过Splay/伸展操作不断将某个节点旋转到根节点,使得整棵树仍然满足二叉查找树的性质,能够在均摊$O(\logn)$时间内完成插入,查找和删除操作,并且保持平衡而不至于退化为链。Splay树由DanielSleator和RobertTarjan于1985年发明。结构节点维护信息xtotfa[i]ch[i][0/1]val[i]cnt[
无垠
小雨想说好多话
于光里望见你.1.向着高空不停伸展不停伸展树是这样生长人也是2.阳光下的泡沫是被遗忘的希冀当它破灭时就有人走向重生3.星星不是宇宙的星星也不是黑夜的星星星星就是星星它只属于自己4.开始结束产生消逝快乐痛苦世事总是相伴而生5.我想为你画一轮太阳虽然——它本应该是由你自己画上去的
BST二叉搜索树、BBST :AVL树、伸展树、红黑树、b树、kd-树
MachinePlay
4.1二叉搜索树BinNode*search(constT&e,BinNode*_hot,BinNode*x){while(true){if(!x){returnx;}elseif(edata){_hot=x;x=x->lc;}elseif(e>x->data){_hot=x;x=x->rc;}elseif(e==x->data){returnx;}}}BinNode*search(constT&
数据结构和算法(11):红黑树
飞大圣
数据结构和算法 数据结构 算法
概述伸展树实现简便、无需修改节点结构、分摊复杂度低,但可惜最坏情况下的单次操作需要O(n)时间。AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达O(logn)次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。红黑树通过为节点指定颜色,并巧妙地动态调整,红黑树可保证:在每次插入或删除操作之后的重平衡过程中,全树拓扑结构的更新
【平衡树】splay伸展树
SY奇星
高级数据结构 数据结构
目录一.定义二.数据存储方式&&main函数三.insert四.splay五.rotate六.前驱后继七.delete八.查排名九.查排第几十.AC代码一.定义伸展树(SplayTree)是一种自调整二叉搜索树,它通过不断进行伸展(splay)操作,将最近访问的节点移动到树的根节点,以提高对这些节点的访问效率。伸展树的主要特点是在插入、查找和删除操作时,都会执行伸展操作,使得最近访问的节点位于根节
数据结构和算法(9):伸展树
飞大圣
数据结构和算法 数据结构 算法
伸展树伸展树也是平衡二叉搜索树的一种形式。相对于AVL树,伸展树的实现更为简捷。伸展树无需时刻都严格地保持全树的平衡,但却能够在任何足够长的真实操作序列中,保持分摊意义上的高效率。伸展树也不需要对基本的二叉树节点结构,做任何附加的要求或改动,更不需要记录平衡因子或高度之类的额外信息,故适用范围更广。数据局部1)刚刚被访问过的元素,极有可能在不久之后再次被访问到;2)将被访问的下一元素,极有可能就处
普通平衡树 Splay
WangLi&a
数据结构 平衡树 伸展树 Splay 分裂树
Splay简介Splay(伸展树),又叫做分裂树,是一种自调整形式的二叉查找树,满足二叉查找树的性质:一个节点左子树的所有节点的权值,均小于这个节点的权值。且其右子树所有节点的权值,均大于这个节点的权值。因此Splay的中序遍历是一个递增序列。Splay可以用来维护实链剖分(LCT)等,作为普通平衡树,它的优势在于不需要记录用于平衡树的冗余信息。Splay维护一个有序集合,支持如下操作:向集合中添
数据结构—伸展树
飞扬code
伸展树的介绍伸展树(SplayTree)是一种二叉排序树,它能在O(logn)内完成插入、查找和删除操作。1、伸展树属于二叉查找树,即它具有和二叉查找树一样的性质:假设x为树中的任意一个结点,x节点包含关键字key,节点x的key值记为key[x]。如果y是x的左子树中的一个结点,则key[y]=key[x]。2、除了拥有二叉查找树的性质之外,伸展树还具有的一个特点是:当某个节点被访问时,伸展树会
acm-【平衡树】学习笔记(Splay,Treap,fhq Treap,替罪羊树,红黑树,avl tree,B树,B+树)
&*^*&
数据结构 acm竞赛 算法 平衡树 红黑树 Splay
引言本文的写作目的主要是为了作者日后复习,也供浏览本文的群众以参考,若有不严谨之处欢迎在评论区指出。本文需要的前置知识:二叉查找树目录引言SplayTreapfhqTreap替罪羊树红黑树avltreeBtreeB+tree下面所有的代码都以LuoGuP3369【模板】普通平衡树为模板题进行编写。SplaySplay又名伸展树,是一种比较常见的平衡树,它的核心操作主要是旋转操作,通过连续的旋转将某
Splay
由希儿
Splay(伸展树)是一种维护二叉搜索树的数据结构,可以用它干一些很神奇的东西,这篇文章先来介绍它的基本操作。首先定义几个变量:fa[x]表示x的父节点ch[x][y]表示x的儿子节点,y=0表示左儿子,y=1表示右儿子cnt[x]表示x这个数出现了几次val[x]表示x节点的权值是多少size[x]表示以x为根的树节点个数(树的大小)tot_size表示树的总大小root表示当前根节点是哪个下面
多线程编程之卫生间
周凡杨
java 并发 卫生间 线程 厕所
如大家所知,火车上车厢的卫生间很小,每次只能容纳一个人,一个车厢只有一个卫生间,这个卫生间会被多个人同时使用,在实际使用时,当一个人进入卫生间时则会把卫生间锁上,等出来时打开门,下一个人进去把门锁上,如果有一个人在卫生间内部则别人的人发现门是锁的则只能在外面等待。问题分析:首先问题中有两个实体,一个是人,一个是厕所,所以设计程序时就可以设计两个类。人是多数的,厕所只有一个(暂且模拟的是一个车厢)。
How to Install GUI to Centos Minimal
sunjing
linux Install Desktop GUI
http://www.namhuy.net/475/how-to-install-gui-to-centos-minimal.html
I have centos 6.3 minimal running as web server. I’m looking to install gui to my server to vnc to my server. You can insta
Shell 函数
daizj
shell 函数
Shell 函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
shell中函数的定义格式如下:
[function] funname [()]{
action;
[return int;]
}
说明:
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回
Linux服务器新手操作之一
周凡杨
Linux 简单 操作
1.whoami
当一个用户登录Linux系统之后,也许他想知道自己是发哪个用户登录的。
此时可以使用whoami命令。
[ecuser@HA5-DZ05 ~]$ whoami
e
浅谈Socket通信(一)
朱辉辉33
socket
在java中ServerSocket用于服务器端,用来监听端口。通过服务器监听,客户端发送请求,双方建立链接后才能通信。当服务器和客户端建立链接后,两边都会产生一个Socket实例,我们可以通过操作Socket来建立通信。
首先我建立一个ServerSocket对象。当然要导入java.net.ServerSocket包
ServerSock
关于框架的简单认识
西蜀石兰
框架
入职两个月多,依然是一个不会写代码的小白,每天的工作就是看代码,写wiki。
前端接触CSS、HTML、JS等语言,一直在用的CS模型,自然免不了数据库的链接及使用,真心涉及框架,项目中用到的BootStrap算一个吧,哦,JQuery只能算半个框架吧,我更觉得它是另外一种语言。
后台一直是纯Java代码,涉及的框架是Quzrtz和log4j。
都说学前端的要知道三大框架,目前node.
You have an error in your SQL syntax; check the manual that corresponds to your
林鹤霄
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'option,changed_ids ) values('0ac91f167f754c8cbac00e9e3dc372
MySQL5.6的my.ini配置
aigo
mysql
注意:以下配置的服务器硬件是:8核16G内存
[client]
port=3306
[mysql]
default-character-set=utf8
[mysqld]
port=3306
basedir=D:/mysql-5.6.21-win
mysql 全文模糊查找 便捷解决方案
alxw4616
mysql
mysql 全文模糊查找 便捷解决方案
2013/6/14 by 半仙
[email protected]
目的: 项目需求实现模糊查找.
原则: 查询不能超过 1秒.
问题: 目标表中有超过1千万条记录. 使用like '%str%' 进行模糊查询无法达到性能需求.
解决方案: 使用mysql全文索引.
1.全文索引 : MySQL支持全文索引和搜索功能。MySQL中的全文索
自定义数据结构 链表(单项 ,双向,环形)
百合不是茶
单项链表 双向链表
链表与动态数组的实现方式差不多, 数组适合快速删除某个元素 链表则可以快速的保存数组并且可以是不连续的
单项链表;数据从第一个指向最后一个
实现代码:
//定义动态链表
clas
threadLocal实例
bijian1013
java thread java多线程 threadLocal
实例1:
package com.bijian.thread;
public class MyThread extends Thread {
private static ThreadLocal tl = new ThreadLocal() {
protected synchronized Object initialValue() {
return new Inte
activemq安全设置—设置admin的用户名和密码
bijian1013
java activemq
ActiveMQ使用的是jetty服务器, 打开conf/jetty.xml文件,找到
<bean id="adminSecurityConstraint" class="org.eclipse.jetty.util.security.Constraint">
<p
【Java范型一】Java范型详解之范型集合和自定义范型类
bit1129
java
本文详细介绍Java的范型,写一篇关于范型的博客原因有两个,前几天要写个范型方法(返回值根据传入的类型而定),竟然想了半天,最后还是从网上找了个范型方法的写法;再者,前一段时间在看Gson, Gson这个JSON包的精华就在于对范型的优雅简单的处理,看它的源代码就比较迷糊,只其然不知其所以然。所以,还是花点时间系统的整理总结下范型吧。
范型内容
范型集合类
范型类
【HBase十二】HFile存储的是一个列族的数据
bit1129
hbase
在HBase中,每个HFile存储的是一个表中一个列族的数据,也就是说,当一个表中有多个列簇时,针对每个列簇插入数据,最后产生的数据是多个HFile,每个对应一个列族,通过如下操作验证
1. 建立一个有两个列族的表
create 'members','colfam1','colfam2'
2. 在members表中的colfam1中插入50*5
Nginx 官方一个配置实例
ronin47
nginx 配置实例
user www www;
worker_processes 5;
error_log logs/error.log;
pid logs/nginx.pid;
worker_rlimit_nofile 8192;
events {
worker_connections 4096;}
http {
include conf/mim
java-15.输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。 用递归和循环
bylijinnan
java
//use recursion
public static void mirrorHelp1(Node node){
if(node==null)return;
swapChild(node);
mirrorHelp1(node.getLeft());
mirrorHelp1(node.getRight());
}
//use no recursion bu
返回null还是empty
bylijinnan
java apache spring 编程
第一个问题,函数是应当返回null还是长度为0的数组(或集合)?
第二个问题,函数输入参数不当时,是异常还是返回null?
先看第一个问题
有两个约定我觉得应当遵守:
1.返回零长度的数组或集合而不是null(详见《Effective Java》)
理由就是,如果返回empty,就可以少了很多not-null判断:
List<Person> list
[科技与项目]工作流厂商的战略机遇期
comsci
工作流
在新的战略平衡形成之前,这里有一个短暂的战略机遇期,只有大概最短6年,最长14年的时间,这段时间就好像我们森林里面的小动物,在秋天中,必须抓紧一切时间存储坚果一样,否则无法熬过漫长的冬季。。。。
在微软,甲骨文,谷歌,IBM,SONY
过度设计-举例
cuityang
过度设计
过度设计,需要更多设计时间和测试成本,如无必要,还是尽量简洁一些好。
未来的事情,比如 访问量,比如数据库的容量,比如是否需要改成分布式 都是无法预料的
再举一个例子,对闰年的判断逻辑:
1、 if($Year%4==0) return True; else return Fasle;
2、if ( ($Year%4==0 &am
java进阶,《Java性能优化权威指南》试读
darkblue086
java性能优化
记得当年随意读了微软出版社的.NET 2.0应用程序调试,才发现调试器如此强大,应用程序开发调试其实真的简单了很多,不仅仅是因为里面介绍了很多调试器工具的使用,更是因为里面寻找问题并重现问题的思想让我震撼,时隔多年,Java已经如日中天,成为许多大型企业应用的首选,而今天,这本《Java性能优化权威指南》让我再次找到了这种感觉,从不经意的开发过程让我刮目相看,原来性能调优不是简单地看看热点在哪里,
网络学习笔记初识OSI七层模型与TCP协议
dcj3sjt126com
学习笔记
协议:在计算机网络中通信各方面所达成的、共同遵守和执行的一系列约定 计算机网络的体系结构:计算机网络的层次结构和各层协议的集合。 两类服务: 面向连接的服务通信双方在通信之前先建立某种状态,并在通信过程中维持这种状态的变化,同时为服务对象预先分配一定的资源。这种服务叫做面向连接的服务。 面向无连接的服务通信双方在通信前后不建立和维持状态,不为服务对象
mac中用命令行运行mysql
dcj3sjt126com
mysql linux mac
参考这篇博客:http://www.cnblogs.com/macro-cheng/archive/2011/10/25/mysql-001.html 感觉workbench不好用(有点先入为主了)。
1,安装mysql
在mysql的官方网站下载 mysql 5.5.23 http://www.mysql.com/downloads/mysql/,根据我的机器的配置情况选择了64
MongDB查询(1)——基本查询[五]
eksliang
mongodb mongodb 查询 mongodb find
MongDB查询
转载请出自出处:http://eksliang.iteye.com/blog/2174452 一、find简介
MongoDB中使用find来进行查询。
API:如下
function ( query , fields , limit , skip, batchSize, options ){.....}
参数含义:
query:查询参数
fie
base64,加密解密 经融加密,对接
y806839048
经融加密 对接
String data0 = new String(Base64.encode(bo.getPaymentResult().getBytes(("GBK"))));
String data1 = new String(Base64.decode(data0.toCharArray()),"GBK");
// 注意编码格式,注意用于加密,解密的要是同
JavaWeb之JSP概述
ihuning
javaweb
什么是JSP?为什么使用JSP?
JSP表示Java Server Page,即嵌有Java代码的HTML页面。使用JSP是因为在HTML中嵌入Java代码比在Java代码中拼接字符串更容易、更方便和更高效。
JSP起源
在很多动态网页中,绝大部分内容都是固定不变的,只有局部内容需要动态产生和改变。
如果使用Servl
apple watch 指南
啸笑天
apple
1. 文档
WatchKit Programming Guide(中译在线版 By @CocoaChina) 译文 译者 原文 概览 - 开始为 Apple Watch 进行开发 @星夜暮晨 Overview - Developing for Apple Watch 概览 - 配置 Xcode 项目 - Overview - Configuring Yo
java经典的基础题目
macroli
java 编程
1.列举出 10个JAVA语言的优势 a:免费,开源,跨平台(平台独立性),简单易用,功能完善,面向对象,健壮性,多线程,结构中立,企业应用的成熟平台, 无线应用 2.列举出JAVA中10个面向对象编程的术语 a:包,类,接口,对象,属性,方法,构造器,继承,封装,多态,抽象,范型 3.列举出JAVA中6个比较常用的包 Java.lang;java.util;java.io;java.sql;ja
你所不知道神奇的js replace正则表达式
qiaolevip
每天进步一点点 学习永无止境 纵观千象 regex
var v = 'C9CFBAA3CAD0';
console.log(v);
var arr = v.split('');
for (var i = 0; i < arr.length; i ++) {
if (i % 2 == 0) arr[i] = '%' + arr[i];
}
console.log(arr.join(''));
console.log(v.r
[一起学Hive]之十五-分析Hive表和分区的统计信息(Statistics)
superlxw1234
hive hive分析表 hive统计信息 hive Statistics
关键字:Hive统计信息、分析Hive表、Hive Statistics
类似于Oracle的分析表,Hive中也提供了分析表和分区的功能,通过自动和手动分析Hive表,将Hive表的一些统计信息存储到元数据中。
表和分区的统计信息主要包括:行数、文件数、原始数据大小、所占存储大小、最后一次操作时间等;
14.1 新表的统计信息
对于一个新创建
Spring Boot 1.2.5 发布
wiselyman
spring boot
Spring Boot 1.2.5已在7月2日发布,现在可以从spring的maven库和maven中心库下载。
这个版本是一个维护的发布版,主要是一些修复以及将Spring的依赖提升至4.1.7(包含重要的安全修复)。
官方建议所有的Spring Boot用户升级这个版本。
项目首页 | 源