c++自帶可持久化平衡樹
阿新 • • 發佈:2021-11-18
宣告:
C++11及以後開始支援
可以當作可持久化平衡樹使用,內部構造是一個塊狀連結串列
(1)標頭檔案
#include<ext/rope>
(2)呼叫名稱空間
using namespace __gnu_cxx;
(3)宣告使用
rope<int>Irp; rope<long long>Lrp; crope crp;//相當於定義成rope<char>,即定義為string型別 rope<char>rop; rope<double>Drp; //rope<PII>Prp;不合法
支援的操作
push_back(x); 在末尾新增x insert(pos,x); 在pos插入x erase(pos,x); 從pos開始刪除x個 replace(pos,x); 從pos開始換成x substr(pos,x); 提取pos開始x個 at(x)/[x]; 訪問第x個元素 test.clear(); 清空元素
char型別的rope
insert(int pos, string &s, int n);
將字串s的前n位插入rope的下標pos處
append(string &s,int pos,int n);
把字串s中從下標pos開始的n個字元連線到rope的結尾,如沒有引數n則把字串s中下標pos後的所有字元連線到rope的結尾,如沒有引數pos則把整個字串s連線到rope的結尾
substr(int pos, int len);
提取rope的從下標pos開始的len個字元
at(int x);
訪問rope的下標為x的元素
erase(int pos, int num);
從rope的下標pos開始刪除num個字元
copy(int pos, int len, string &s);
從rope的下標pos開始的len個字元用字串s代替,如果pos後的位數不夠就補足
replace(int pos, string &x);
從rope的下標pos開始替換成字串x,x的長度為從pos開始替換的位數,如果pos後的位數不夠就補足
int n, m; char a[N]; rope<char>r; int main() {for(int i = 0; i <= 10; ++ i) a[i] += i +'0'; r.insert(0, a + 2, 8); for(int i = 0; i <= 10; ++ i) cout << r.at(i) << " "; puts(""); for(int i = 0; i <= 10; ++ i) cout << r[i] << " "; puts(""); return 0; }
2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9
int型別的rope
insert(int pos, int *s, int n);
將int陣列(以下的s都是int陣列)s的前n位插入rope的下標pos處,如沒有引數n則將陣列s的所有位都插入rope的下標pos處
append(int *s,int pos,int n);
把陣列s中從下標pos開始的n個數連線到rope的結尾,如沒有引數n則把陣列s中下標pos後的所有數連線到rope的結尾,如沒有引數pos則把整個陣列s連線到rope的結尾
substr(int pos, int len);
提取rope的從下標pos開始的len個數
at(int x);
訪問rope的下標為x的元素
erase(int pos, int num);
從rope的下標pos開始刪除num個數
copy(int pos, int len, int *s);
從rope的下標pos開始的len個數用陣列s代替,如果pos後的位數不夠就補足
replace(int pos, int *x);
從rope的下標pos開始替換成陣列x,x的長度為從pos開始替換的位數,如果pos後的位數不夠就補足
rope<int>rp; int main() { rp.append(3); rp.append(1); rp.append(2); rp.append(1); rp = rp.substr(1, 3);//從1開始截3個數字,注意rope是從0開始的,所有的容器都是從0開始的 for(int i = 0; i < rp.size(); ++ i) cout << rp[i] << " "; puts(""); return 0; }
輸出:
1 2 1
具體的細節
時間複雜度:$O(n\sqrt{n})$(因為是用塊狀連結串列實現的)
空間複雜度:$O(\sqrt{n})$
可持久優化
定義方法
rope<char> *now[p];
如何申請更新一個新的可持久化版本:
now[0]=new rope<char>();
如何繼承版本
now[cnt]=new rope<char>(*now[cnt-1]);
如何回到查詢過去的版本
ans=now[cnt]->at(num);