双阵列问题

时间:2011-05-13 10:56:38

标签: c++ algorithm data-structures

我试图从http://linux.thai.net/~thep/datrie/datrie.html了解Double-Array Trie实现 但我不明白以下部分。

check[base[s] + c] = s
base[s] + c = t 

在此添加c意味着什么。

任何人都可以用简单的语言解释算法。

2 个答案:

答案 0 :(得分:1)

想象一下,你将2D数组折叠成一维数组:

int arr2D[2][3];
int arr1D[2 * 3]; // # of rows * # of columns

// access element [1][2] of 2D array, i.e., the last element
int elem2D = arr2D[1][2];
// access element [1][2] of 1D array, i.e., the last element
int elem1D = arr1D[1 * 3 + 2];
// =========================================================
lets visualize the array access:
arr2D => x/y 0  1  2
          0 [N][N][N]
+1 on x > 1 [N][N][N]
+2 on y ---------- ^
y_len  =>   ^-------^ 3 elements
so the access happens with x * y_len + y
                           1 *   3   + 2
now for the 1D array
we want the second row, so we go with 1 * 3
(0-based access, y_len = 3)
and then we want the 3rd element, so + 2
(again, 0-based access)
arr1D =>  x  0  1  2 
            [N][N][N]
             3  4  5
1 * 3 = 3 > [N][N][N]
      + 2 = 5 ---- ^

我希望我没有让这太复杂(尽管我认为我做过......)。 :)

答案 1 :(得分:0)

字符是“从零开始”,即'a'是0,'b'是1,'c'是2,等等。查找“a”意味着将0添加到当前节点的基址并检查该索引处的所有者。如果该所有者是当前节点,则在trie中有一个以“a”开头的字符串,该索引的基地址是下一次查找的基址。