算法 {可持久化数据结构(Git版本树)}

算法 {可持久化数据结构(Git版本树)}

可持久化數據結構(Git版本樹)

定義

對於同構的數據結構T, 如果他的操作 只能影響很少的點(比如線段樹 他有4*N個點 但一次修改操作 只會影響log(N)個點), 那麼對於當前版本C 操作以後變成CC 就可以讓CC中未被影響/訪問的點 直接使用C中的點, 也就是 Git就是為了省空間;

整體來說 所有版本構成一個Git有向森林, Git上的一個節點 就對應一個數據結構T, 具體操作如下:
1(創建Git上的一個根節點);
2(令P為Git上的一個節點, 創建P的一個兒子C, C的內容與P一樣);
3(令P為Git上的一個葉子節點, 修改P);

相關定義

#同構的數據結構#
對於數據結構T, 無論怎麼操作 他們的結構都是固定的靜態的, 則T為同構的;
. 比如, 對於維護[0,N]區間的線段樹, 無論怎麼修改 他都是只有1個根節點(表示[0,N]) 然後2個兒子節點 …, 他的結構是固定死的, 所以線段樹是同構的; 而對於平衡樹 比如1-2 可能1是根 也可能2是根, 他不是同構的;

性質

可持久化 應該是不可以修改節點的, 因為他是共享的, 你修改一個版本 她的後驅版本 都會受到影響;

@DELI;

對於修改操作(即修改Git上某個節點P), 要保證P一定是葉子節點;
因為 如果P有兒子S, S共用了此時P裡面的內容datum, 可是 如果你直接修改P 把datum給修改了, 那麼其實也就順帶的把S裡面的內容給修改了 這就錯誤了;
因此 不要以為Git就是簡單的版本管理, 這是錯誤的, 這種版本管理 需要滿足某些條件, 你要根據他的要求 來進行版本管理;

筆記

不產生新版本的前提下, 你可以在葉子節點的版本上修改, 但不能在(非葉子節點)的版本上直接修改;
. Trie的節點 不可以維護(子節點)的信息, 他是前綴樹, 維護的必須是(父節點)的信息; 因此他的遍歷 不是遞歸的;

@DELI;

只有數據結構 他的更新操作 不會改變其本身結構時 才可以做持久化;
比如平衡樹就不能 因為zig zag會改變樹本身的結構, 而(樹狀數組/線段樹/堆/TRIE)等 他的結構是靜態的;

他的目的是: 存儲所有的歷史版本, 即git;

節點N個 更新操作M個, 如果暴力 則需要N*M, 而因為更新操作 只會影響log(N)個節點 因此可以log(N) * M;

從結構上看, v2是v1的子節點 則 v2的樹 一定是包含 v1的樹, 這非常重要, 從結構來看 一個點 他對應了多個node 比如nodes[a/b/c/d] 他們其實對應在樹上 是同一個點! 因為樹結構 是絕對的 唯一的;
如果v2的某個nodes[x] == -1 設他對應的結構上的點是T, 那麼 所有<= v2版本的樹 他在結構上 一定沒有T這個點(沒有被開闢); 可以用反證法 因為如果存在v1 那麼v2是完全複製了v1了的;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值