蒟蒻の二叉平衡树学习总结
定义
平衡树(Balance Tree,BT) 指的是,任意节点的子树的高度差都小于等于1。常见的符合平衡树的有,B树(多路平衡搜索树)、AVL树(二叉平衡搜索树)等。平衡树可以完成集合的一系列操作, 时间复杂度和空间复杂度相对于“2-3树”要低,在完成集合的一系列操作中始终保持平衡,为大型数据库的组织、索引提供了一条新的途径。
性质与证明
性质:高为h的BT, 其结点的数目在2^(h+1)-1和1/2(3^(h+1)−1)之间, 叶的数目在2^h和3^h之间。
证明:BT退化为每个结点 (非叶) 只有两棵子树时, 结点的数目最少, 叶子也最少。设层号为i则各层结点数为2^(i-1)个, 那么高为h的BT最大层号是j时, 有h=j-1。整个树的结点数为s=2^0+2^1+2^2+…+2^h, 故s=2^(h+1)-1。其叶子的个数是2^h。同理, 当BT每个非叶结点都有三棵子数时, 结点数目最多。此时结点数为:
s=3^0+3^1+3^2+⋯+3^h‚s=1/2(3^(h+1)−1),其叶子的个数是3^h。
应用
在智能电网中,与传统路由协议不同,突发性拥塞不再是数据采集的主要风险,风险的新来源是数据流过度集中在网络的关键节点而导致的拥塞。为此,提出了一种能够实现数据平衡的数据采集路由机制用以克服网络拥塞。该机制抽象出配用通信网络的数学模型;其次,针对无线网状网络(WMNs)路由协议,以节点排队队列长度作为决策参数建立路由度量模型(数据平衡度量模型,DBMM),并以度量值最小作为决策条件,设计了基于平衡树的路由算法(基于DBMM的路由算法,RA-DBMM)。有效地改善数据拥塞问题,提高系统可靠性和吞吐量。
非常感谢百度百科(手动狗头)
例题
265. 营业额统计(非常感谢 @雪为谁落 大佬)
思路:
看到题目,便想到了set,set不光存储方便,而且支持lower_bound,感觉比较好用。
读入当前营业额时,利用set当中自带的lower_bound进行扫描,复杂度为O(logn)。
然后分两种情况:
1.如果i==1,则ans直接加上x
2.否则ans加上min(x-x的前驱,x-x的后继)–>这里的前驱与后继都是针对于数值大小
Tip:
1.set中lower_bound返回的是指针
2.为了防止lower_bound返回指针是set.end()–>即寻找不到,应当预处理一下,在set当中预先加入无穷大与负无穷大这样可以方便判断
时间复杂度
O ( n l o g n ) O(nlogn) O(nlogn)
C o d e Code Code
#include<bits/stdc++.h>
using namespace std;
const int N=40000+5;
int n,ans;
set<int>s;
int main(){
cin>>n;
s.insert(1e9);
s.insert(-(1e9));
for(int i=1;i<=n;i++){
cin>>x;
set<int>::iterator it=s.lower_bound(x);
if(i!=1){
ans+=min(abs(x-*(--it)),abs(x-*it));
}else ans+=abs(x);
s.insert(x);
}
cout<<ans;
return 0;
}