CMU15445 Project0笔记

环境配置中遇到的问题 WSL2 Ubuntu18.04

  • clang更新:
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - 
sudo vi /etc/apt/sources.list

加入下面内容:

deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic main
# Needs 'sudo add-apt-repository ppa:ubuntu-toolchain-r/test' for libstdc++ with C++20 support
# 16
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-16 main
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-16 main
# 17
deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic-17 main
deb-src http://apt.llvm.org/bionic/ llvm-toolchain-bionic-17 main

然后更新:

sudo apt update
sudo apt-get install clang-format clang-tidy clang-tools clang
sudo apt-get purge clang-10 # 卸载老版本,按你自己的实际情况选择参数
sudo apt-get purge libclang-10-dev

Task#1 Copy-On-Write Trie

  • 注意GetRoot是一个不能用的函数
  • Get(key):
    • 正常的前缀树思路
    • 算法流程:
      1. 从key中取一个字符,如果当前节点不存在对应的儿子节点,返回nullptr;否则,移动到对应的儿子节点,并重复该过程,直到取完key中所有字符,到第2步
      2. 判断当前节点是不是值节点,如果不是,返回nullptr;否则到第3步
      3. 将该节点转化成TrieNodeWithValue* 类型,如果转换成功,返回该指针;否则返回nullptr
  • Put(key, value):
    • 注意写时复制
    • 算法流程:
      1. 新建一棵树new_trie,一个新的根节点new_root
      2. 如果当前前缀树根节点不为空,更新new_root为当前前缀树根节点的Clone
      3. 特殊处理key为空的情况,新建一个以value作为值,以new_root的儿子节点作为儿子节点的值节点,将其作为new_trie的根节点,并返回* new_trie
      4. 从key中取一个字符,如果当前节点不存在对应的儿子节点,到第5步;否则,到第6步,当key中只剩最后一个字符时,到第7步
      5. 该节点不能被复用,创建一个新节点,并将对应的字符ch和新节点new_node加到当前节点的儿子节点中,移动到new_node,再次执行第4步
      6. 该节点可以复用,生成一个该节点的Clone,并将其更新到当前节点的儿子节点中,移动到该新节点,再次执行第4步
      7. 根据key中最后一个字符,找对应的儿子节点,如果该儿子节点存在,以其为基础创建一个新的值节点;否则,创建一个新的值节点
      8. 将new_trie的根节点设置成new_root,并返回* new_trie
  • Delete(key):
    • 对应代码中是Remove函数
    • 算法流程:
      1. 新建一棵树new_trie,一个新的根节点new_root,用一个map来记录各节点的父节点,其形式是pair<std::shared_ptr, std::pair<std::shared_ptr, char>>,(cur, (fa, ch))表明cur节点是fa节点遇到ch字符转移过来的
      2. 如果当前前缀树根节点不为空,更新new_root为当前前缀树根节点的Clone
      3. 特殊处理key为空的情况,如果当前节点是个值节点,以其为基础新建一个非值节点,并将其设置为新前缀树的树根,返回新树;否则,返回旧树
      4. 从key中取一个字符,如果当前节点不存在对应的儿子节点,返回旧树;否则,到第5步,当key中只剩最后一个字符时,到第6步
      5. 该节点可以复用,生成一个该节点的Clone,并将其更新到当前节点的儿子节点中,记录其父节点情况,移动到该新节点,再次执行第4步
      6. 根据key中最后一个字符,找对应的儿子节点,如果该儿子节点存在并且是个值节点,以其为基础创建一个非值节点,到第7步;否则,返回旧树
      7. 删除节点之后,需要清空无用的节点,无用的节点满足几个条件:不是值节点 + 没有儿子节点。从当前被删除节点向上找,借助记录父节点的map,清理无用节点。如果所有节点都被清空了,将新树的根节点设置成空,否则设置成new_root,返回新树

Task#2 Concurrent Key-Value Store

  • 以Task1中实现的三个函数为基础,实现多线程版本

  • Get(key):

    • 算法流程:
      1. 给根节点上锁,取根节点,释放根节点的锁
      2. 调用单线程版本的Get函数,如果返回值是nullptr,返回std::nullopt;否则构建并返回std::optional<ValueGuard>
  • Put(key, value):

    • 算法流程:
      1. 请求写锁
      2. 给根节点上锁,取根节点,释放根节点的锁
      3. 调用单线程版本的Put函数
      4. 给根节点上锁,更新根节点,释放根节点的锁
      5. 释放写锁
  • Delete(key):

    • 算法流程:
      1. 请求写锁
      2. 给根节点上锁,取根节点,释放根节点的锁
      3. 调用单线程版本的Delete函数
      4. 给根节点上锁,更新根节点,释放根节点的锁
      5. 释放写锁

Task#3 Debugging

  • 在对应的位置使用cout打印出对应的数值就可以了

Task#4 SQL String Functions

  • 修改string_expression.h文件中的Compute函数
  • 算法流程:判断操作类型,根据操作类型将字符串中的字符全改成大写或小写
  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMU 15445 课程的 Project 0 是一个调试练习,旨在帮助学生熟悉调试工具和技术。在这个项目中,你将开始使用 GDB 和 Valgrind 这两个常用的调试工具,以及一些其他辅助工具。以下是一些问题和步骤,帮助你完成这个练习: 1. 你需要查看项目中提供的代码,并了解它的结构和功能,这样你才能更好地理解程序的逻辑和可能出现的 bug。 2. 接下来,你需要编译项目,并确保没有编译错误。如果出现错误,你需要修复它们,这可能需要检查一些语法错误或缺失的库。 3. 一旦成功编译项目,你就可以使用 GDB 进行调试了。GDB 是一个强大的调试器,可以帮助你找出程序中的错误。你可以使用 GDB 来单步执行代码、设置断点、查看变量的值等等。通过使用 GDB,你可以逐步查看代码运行的路径,并找出程序崩溃或产生错误的原因。 4. 在使用 GDB 进行调试时,你可以通过设置断点来暂停程序的执行,并查看变量的值和程序的状态。你可以使用“break”命令在程序中设置断点,并通过“run”命令启动程序。当程序到达这个断点时,它会停止执行,你可以使用“print”命令查看变量的值,或者“step”命令逐步执行代码。 5. 另一个常用的调试工具是 Valgrind。Valgrind 可以帮助你检测内存泄漏和错误的访问方式。你可以使用“valgrind”命令来运行程序,并查看 Valgrind 的输出。它会告诉你有关程序中任何潜在问题的信息,例如未初始化的变量、访问越界等。 6. 最后,当你发现 bug 并修复它们后,可以运行各种测试用例来验证程序的正确性。测试用例可以帮助你确定程序是否按预期工作,并且在修改代码后,它们可以帮助你确保你的修复没有引入新的错误。 通过完成 CMU 15445 项目 0 的调试练习,你将掌握一些重要的调试技巧和工具,这对于进一步开发和调试软件应用程序将非常有用。希望上述步骤和建议对你有所帮助,祝你顺利完成这个项目!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值