1 前言
配置按照文档照做即可,有一点需要注意:
我的环境是ubuntu22.4,需要提前安装 cmake clang-14 gdb g++
sudo apt install cmake clang-14 gdb g++
配置根目录下的CMakeLists
set(CMAKE_C_COMPILER "/usr/bin/clang-14")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++-14")
2 Task #1 - Copy-on-Write 尝试
原项目的图不够清晰明白,笔者这张图比较直观。但是也没有体现完全复用的思路。
首先先用到三个类:TrieNode、TrieNodeWithValue和Trie。
其中TrieNode是父类:每个节点包含一个子节点的映射
children_
,其中键是下一个字符,值是下一个 TrieNode 节点。还包含一个布尔值is_value_node_
,表示该节点是否是一个终止节点。TrieNodeWithValue是子类:包含一个值的指针
value_
,表示该节点关联的值。Trie是前缀树类。
在本任务中,您需要修改trie .h和trie .cpp来实现写时复制(copy-on-write) tree。在copy-on-write tree中,操作不会直接修改原始tree中的节点。相反,将为修改后的数据创建新节点,并为新修改的trie返回一个新根。写时复制(Copy-on-write)使我们能够在每次操作之后随时以最小的开销访问该树。考虑在上面的例子中插入("ad", 2)。我们通过重用原始树中的两个子节点来创建一个新的Node2,并创建一个新的值节点2。(见下图)
如果我们接着插入("b", 3),我们将创建一个新的根,一个新的节点,并重用以前的节点。通过这种方式,我们可以在每次插入操作之前和之后获得树的内容。只要我们有根对象(Trie类),我们就可以访问当时Trie中的数据。(见下图)
再举一个例子:如果我们插入(“a”,“abc”)并删除(“ab”,1),我们可以得到下面的trie。注意,父节点可以有值,并且在删除后需要清除所有不必要的节点。空树由nullptr表示。