线段树学习
来源:互联网 发布:二叉树前中后遍历算法 编辑:程序博客网 时间:2024/05/29 08:40
今天学习了线段树。。
代码是敲了不少
可是感觉还没有真正理解
先不贴题目。。
再消化消化。。
一会儿还有计组实验。。还有那个傲娇的老师。。。真是烦。。
饿。。
先去吃饭去。。。一天木有吃。。。。。。
以下转自:http://www.cnblogs.com/liushang0419/archive/2011/10/20/2219325.html
线段树模板
//线段树的节点
//节点包括两部分信息,基本域,和信息域
//基本域:左右边界ld,rd. 左右孩子:lc,rc
//信息域:key值,如RMQ问题中,信息域中存储的是区间最大值
struct
Node{
int
ld,rd;
Node *lc,*rc;
int
key;
};
//空树的建立,内含key值的初始化;
//一般在主函数中首先调用 Node* root= buildtree(1,n);建立一棵新树
Node *buildtree(
int
a,
int
b){
Node * p=
new
Node;
//给P申请一块内存
p->ld=a;
p->rd=b;
//{初始化 p->key }
if
(a==b)
return
p;
//叶子节点
p->lc=buildtree(a,(a+b)/2);
p->rc=buildtree((a+b)/2+1,b);
return
p;
}
void
insert(Node *T,
int
a,
int
b,
int
key){
if
(a<=T->ld&&b>=T->rd){
//{根据key处理T->key; 然后 return ;}
}
if
(a<=(T->ld+T->rd)/2)
insert(T->lc,a,b,key);
if
(b>(T->ld+T->rd)/2)
insert(T->rc,a,b,key);
//{根据T->lc和T->rc的信息处理T->key} (此处类似于归并排序中最后的合并操作)
}
int
search(Node *T,
int
a,
int
b){
int
res;
if
(a<=T->ld&&b>=T->rd)
// {根据T->key处理res;return res;}
if
(a<=(T->ld+T->rd)/2)
//{根据search(T->lc,a,b)处理res}
if
(b>(T->ld+T->rd)/2)
//根据search(T->rc,a,b)处理res}
return
res;
}
什么是线段树:
线段树是一种用树状结构来存储一个连续区间的信息的数据结构
线段树的作用:
它主要用于处理一段连续区间的插入,查找,统计,查询等操作
复杂度:
设区间的长度是n,所有的操作的复杂度是logN级别的
线段树的性质:
1.线段树是平衡二叉树,最大深度为logN(N为线段树所标示的区间的长度)
2任意的线段树[a,b]在线段树的查询或查找过程中把这个线段最多分成log(b-a)份
以上两条性质保证了线段树除了建树外的操作都是Log(N)级别的复杂度
- 学习线段树
- 线段树学习入门
- 留待学习线段树
- 线段树学习
- 线段树学习
- 线段树学习
- 线段树 学习资料
- 学习笔记 线段树
- 线段树学习小结
- 线段树学习
- 线段树学习
- 线段树学习记录
- 线段树学习
- 线段树学习
- 线段树学习
- 线段树学习笔记
- 线段树学习笔记
- 学习笔记 --- 线段树
- jQuery验证控件jquery.validate.js使用说明+中文API
- Hadoop1.x中的libhdfs和fuse-dfs构建快速云存储
- HDU2444 The Accomodation of Students
- windows phone:Windows Phone 的数据
- RHEL5.2 安装bind-9.5.1-P2
- 线段树学习
- 跟踪算法之:TLD跟踪算法
- android 各种控件颜色值的设置(使用Drawable,Color)
- 禁止和激活约束
- 第1章、搭建Android的开发环境
- python写算法导论 插入排序
- ShellExecute
- OpenStack使用Bosh部署CloudFoundry(三)—部署Micro Bosh
- 【deep learning学习笔记】注释yusugomori的LR代码 --- LogisticRegression.cpp