Double-Array Trie分爲靜態構建和動態構建兩種情況,
動態構建過程中主要利用的公式是:
base[s]+c=t
check[t]=base[s]
靜態構建的過程中主要利用的動態轉移公式是:
base[s]+c=t
check[t] =base[s]
寫的還不錯的博客有以下幾篇:
https://blog.csdn.net/u011730199/article/details/82752521
https://www.cnblogs.com/ooon/p/4883159.html
https://blog.csdn.net/xlxxcc/article/details/67631988
第3、4篇博客以同一個例子來講解的,但是一直不太明白爲什麼下面圖片中的這個位置是8的原因。(可以先看第四篇博客,如果看懂了就不用看我的了。)
特此以下面這個圖爲例子,手推一下最終的矩陣形式。
首先要知道,建立字典樹的過程是一個深度遍歷的過程,而利用建立好的字典樹去做一些查詢操作的時候,利用的是廣度遍歷的過程。
圖從左往右看。
在第四篇博客計算過程中,並沒有給出空節點的position、base和check,我認爲這個過程應該同步給出,要不然會亂。
所以有了如第四篇和第三篇博客中給出的,最終結果。
root A C Z C D D F Q E F F AC AD CD CF ZQ ACE ACFF
i 0 67 69 92 70 71 77 79 86 142 143 74 72 76 78 80 83 73 75
base 1 2 8 4 72 76 78 80 83 73 3 75 -1 -4 -5 -6 -7 -2 -3
check 0 1 1 1 2 2 8 8 4 72 72 3 72 76 78 80 83 73 75