學習treap之前先學的splay,然後發現treap真是太簡單了,greatwall1995神犇的意見要聽啊
bst的缺陷是因為人為搞單調資料才爆的,隨機資料還是logn的時間,treap的思想也基於此,給每個新增的點賦乙個隨機優先值,然後整個樹關於優先值是乙個堆。
clrs上要求讀者證明插入節點後期望的旋轉次數小於2,看到之後就嚇呆了
接下來是具體實現,lrj的**實在是太漂亮了,忍不住貼出來
const int maxn=1000;
double random()
int random(int m)
struct node
int cmp(int x)const
};node* root;
void rotate(node* & o,int d)
node* find1(node* o,int x)
void insert(node* &o,int x)
else
o->maintain();
}void remove(node* &o,int x)else
}else remove(o->ch[d],x);
if (o!=null)o->maintain();
}int rank(node* t,int key)
int kth(node* o,int k)
要注意:
1、這個**較短,但常數較大
2、這個**不能實現高效的prev和next操作
3、如果在linux上交這個**會ce,因為linux不支援相同名字不同型別的兩個函式
4、這個版本有個限制,不能出現重複資料,修改的話insert把cmp換掉即可
用這個treap試了下營業額統計,和splay不相上下,treap的next和prev操作比splay慢,否則的話貌似要比splay快很多
Treap學習筆記
開乙個坑,學一學treap專題 mark乙個習題集 帶旋轉treap模板 struct treap tr 100005 int n,size,root,ans void update int k 更新結點資訊 旋轉 void rturn int k void lturn int k void ins...
Treap 學習筆記
tre ap treap trea p,顧名思義,就是tre e he ap tree heap tree h eap,是一種常見的平衡樹。b st bstbs t性質給定一棵二叉樹,樹上的每個節點帶有乙個權值。對於樹上的任意乙個節點,滿足 滿足這兩條性質的二叉樹就是 二叉查詢樹 bst bstbs...
Treap 學習筆記
平衡樹就是一種可以在log的時間複雜度內完成資料的插入,刪除,查詢第k大,查詢排名,查詢前驅後繼以及其他許多操作的資料結構。treap是一種比較好寫,常數比較小,可以實現平衡樹基本操作的一種平衡樹。treap的平衡是基於隨機化。是將堆與二叉查詢樹結合起來所得到的資料結構。treap在插入數時,給每個...