Ori paper: http://www.cse.unsw.edu.au/~wong/papers/www07.pdfgit
ISX Requirementsgithub
1 Space does matter for many applications
2 Generally reducing space improves cache locality
3 Indirection is expensive
4 Support fast navigations
5 Support fast insertion and deletion
6 Support efficient joins
7 Separate topology, text and schema
For mobile devices: 算法
To find a space-efficient storage scheme for XML data without compromising both query and update performances.數據結構
Figure, the ISX Structureapp
Figure, Sample DBLP XML Fragment ide
壓縮過程:post
採用以下Balanced Parenthesis Encoding方法:(真是一個壓縮 tree structure 的好辦法!經過深度有限遍歷搞定,DFS)性能
還原過程:ui
Node Navigations:編碼
線段樹+括號序列: (資料補充)
上述的算法其實就是這個問題,先看看這個算法。By the way, 博客可見,山東的高中計算機競賽選手現在都達到這樣的水準了?... 牛!
Idea: 化樹爲線性數列,從而解決問題。
它的括號序列就是 (A (B)( C(D)(E) )) 括號序列有着很是好的性質。
問一:C的兄弟有誰? 1) 距離爲2;2) 向左瞧,直接看到 )(,而後找 ( 。
問二:C的長輩有誰? 在左邊且距離爲1. 由於只有一個長輩,因此找到即end。
問三:C的孩子有誰? 在右邊且距離爲1. 遇到右括號,匹配後value = 0,即end。
對於一個括號序列,兩個點之間的距離就是:它們中間的括號成對消除以後剩餘括號的數量。
對於一段括號編碼,咱們使用數對(a,b)來描述它,表示它在消除後有a個左括號,b個右括號。so,咱們只須要設計一種數據結構支持單點修改,區間查詢就好辣。
這讓咱們聯想到線段樹。那麼下一步咱們就是考慮:如何從兩個字節點合併成一個父節點。這讓咱們想起最長連續和。
考察一個合法的序列,若是它有貢獻,那麼序列的左右兩邊必定都有一個黑點,那麼,父節點的最長序列有這樣幾種狀況:
對於前兩種狀況,咱們遞歸處理,第三種狀況的話,分析一下: 也就是說,題目只須要動態維護:max{a+b | S’(a, b) 是 S 的一個子串,且 S’ 介於兩個黑點之間}, 這裏 S 是整棵樹的括號編碼。咱們把這個量記爲 dis(s)。
如今若是能夠經過左邊一半的統計信息和右邊一半的統計信息,獲得整段編碼的統計,這道題就能夠用熟悉的線段樹解決了。
(其餘部分,詳見原文)
解釋:
T10 = 4(左括號), 1(右括號), 0, 4, -1, 3, 1
( | ( | ( | ( | ) | ||
0 | 1 | 2 | 3 | 4 | 3 | |
3 | 2 | 1 | 0 | -1 | 0 |
T11 = 2(左括號), 2(右括號), -1, 1, -1, 1, 1
) | ( | ( | ) | |||
0 | -1 | 0 | 1 | 0 | ||
0 | 1 | 0 | -1 | 0 |
T12 = 3(左括號), 3(右括號), -1, 1, -1, 1, 1
) | ( | ( | ) | ) | ( | ||
0 | -1 | 0 | 1 | 0 | -1 | 0 | |
0 | 1 | 0 | -1 | 0 | 1 | 0 |
T10+T11 = 7(左括號), 3(右括號), 0(0-1+1), 4(4+1-1), -1(-1-1+1), 3(3+1-1), 2
( | ( | ( | ( | ) | ) | ( | ( | ) | |||
0 | 1 | 2 | 3 | 4 | 3 | 2 | 3 | 4 | 3 | ||
3 | 2 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 |
min的和再+1;max的和再-1。
T10+T11+T12 = 9(左括號), 6(右括號), 0(0-1-1+2), 4(4+1+1-2), -1(-1-1-1+2), 3(3+1+1-2), 3
( | ( | ( | ( | ) | ) | ( | ( | ) | ) | ( | ( | ) | ) | ( | ||
0 | 1 | 2 | 3 | 4 | 3 | 2 | 3 | 4 | 3 | 2 | 3 | 4 | 3 | 2 | 3 | |
3 | 2 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 | 1 | 0 | -1 | 0 | 1 | 0 |
min的和再+2;max的和再-2。
Where is the close tag?
方法:匹配左右括號,使之匹配
最後不能忘了把算法的性能吹一吹,指標以下所示: