CMU15/445 2023 Spring-project0 基于字典树的增删改查

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表示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值