copy-on-write 是指操作并不会直接修改原来的 trie node,而是创建一个新的 node 用来修改数据,并返回新的 trie 树的 root 节点。 使用copy-on-write 的好处在于,能够在操作完成的任意时刻,以很小的代价访问 trie 树。 如图所示: 在老的 trie 树上,插入新的 ("b", 3),会创建一个新的 root 节点,然后...
// node是最后构造的std::unique_ptr<TrieNodeWithValue<T>>指针 stack.top()->children[ch] = std::shared_ptr<const TrieNode>(node); node = std::move(stack.top()); stack.pop(); 这样做主要的好处是因为要实现写时复制,如果按顺序将子节点克隆之后插回map中,map会将克隆的子节点强制转换为std:...
将TrieNode的节点拆分成带值(TrieNode)与不带值(TrieNode)两个类。其用意是为了让我们理解C++中父类与子类知道的继承关系以及父类类型与子类类型的相互转化。 task2 task2的任务目标是将task1实现的Copy On Write Trie实现的三个函数进行包装,添加锁机制,实现对三个函数的并发操作。此后所有的实现均会调用包装后...
Put() 函数的流程就是Copy_on_Write的实现的典型实例. 基本思想就是按照key的路径向下访问字典树, 然后途中遇到的节点都是会修改的子树的根节点, 所以需要Copy操作, Copy操作的实现, 在TrieNode中已经给出了, 实际上就是Clone()函数. 可以用下图的实例看出,Put("time", 6)的时候, 实际上插入节点后, 以中...
CMU 15445(SPRING 23)-Project 0-C++ Primer C++-Primer-实现 Trie (前缀树) 本task是要实现一个具有Copy-On-Write特性的Trie。就是每次对一个节点的修改都不实际修改这个节点,而是拷贝出来一个副本,尽可能的复用节点…阅读全文 赞同2 1 条评论 分享收藏...
Task #1 – Copy-On-Write Trie 要求实现一个写时拷贝的前缀树,对前缀树不熟悉的可以做做leetcode的这题,能快速理解到前缀树是什么。 关于写时拷贝(Copy-On-Write,COW)在使用写时拷贝的情况下,当多个进程或线程共享同一份内存数据时,它们实际上共享同一个物理内存页。这意味着在一开始,这些进程或线程都指向相...
1. 概要 本文主要是记录在写该project的过程中遇到的一些问题和一些知识点总结,方便后续回顾。 该任务是让我们实现Trie树,在实现单线程操作的基础上,再实现并发操作 在该任务中我们必须实… 阅读全文 2023fallCMU15-445实验记录 来颗维c 经过一个月的找实习无果,学习了一下大佬的简历项目。遂准备也来做...
C++-Primer-实现 Trie (前缀树) 本task是要实现一个具有Copy-On-Write特性的Trie。就是每次对一个节点的修改都不实际修改这个节点,而是拷贝出来一个副本,尽可能的复用节点,对这个副本进行修改。修改操作可以是修改节点的value,也可以是修改节点的childrens。 CMU15445 (Spring 2023) Project #0 - C++ Primer - ...
why copy on write? 每次修改都会产生一个新的trie,如果不能影响到原来的trie,需要尽量复用节点 智能指针可通过get获取原始指针,可用dynamic_cast判断派生类指针 Task1 Get: 找到后用dynamic_cast把指针改成指向TrieNodeWithValue Put: 所有经过的节点都需要克隆 ...
Task #1 - Copy-On-Write Trie 这个任务要求实现Get、Put、Remove方法。 Get的话要判断key是否为空,为空那就是root为value节点。遍历的时候map不要用[],也不要用at来判断是否存在这个键值对(算竞人只会[]),因为函数是const的。还要记得判断root是否为空。