[{"content":"我的 RSS 工作流 我使用 RSS 订阅我喜欢的源，并依赖 Karakeep 来管理书签。为了简化这个流程，我将 Miniflux 与 Karakeep 进行了同步集成，这样我在 RSS 阅读器中保存的任何文章都会自动保存为书签。此外，我还将 Miniflux 与 Telegram 进行了集成，以便轻松地与朋友分享文章。\ngraph TD A[RSS 订阅源] --\u0026gt;|1. 定期自动获取| B(Miniflux 阅读器) B --\u0026gt;|2. 新文章到达| H[触发 Telegram 机器人] H --\u0026gt;|3. 自动发布| G[(Telegram 频道)] B --\u0026gt;|4. 用户阅读并加星| C[文章加星] C --\u0026gt;|5. 同步集成| E[(Karakeep 书签)] ","permalink":"https://rmtt.github.io/zh/posts/rss-workflow/","summary":"\u003ch1 id=\"我的-rss-工作流\"\u003e我的 RSS 工作流\u003c/h1\u003e\n\u003cp\u003e我使用 RSS 订阅我喜欢的源，并依赖 \u003ca href=\"https://karakeep.app/\"\u003eKarakeep\u003c/a\u003e 来管理书签。为了简化这个流程，我将 \u003ca href=\"https://miniflux.app/\"\u003eMiniflux\u003c/a\u003e 与 Karakeep 进行了同步集成，这样我在 RSS 阅读器中保存的任何文章都会自动保存为书签。此外，我还将 Miniflux 与 Telegram 进行了集成，以便轻松地与朋友分享文章。\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\n  graph TD\n    A[RSS 订阅源] --\u0026gt;|1. 定期自动获取| B(Miniflux 阅读器)\n\n    B --\u0026gt;|2. 新文章到达| H[触发 Telegram 机器人]\n    H --\u0026gt;|3. 自动发布| G[(Telegram 频道)]\n    \n    B --\u0026gt;|4. 用户阅读并加星| C[文章加星]\n    C --\u0026gt;|5. 同步集成| E[(Karakeep 书签)]\n\u003c/pre\u003e\n\u003cscript type=\"module\"\u003e\n  import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';\n  if (!window.mermaidInitialized) {\n    window.mermaidInitialized = true;\n    mermaid.initialize({ startOnLoad: false });\n    const render = async () =\u003e {\n      await mermaid.run({ querySelector: '.mermaid' });\n    };\n    if (document.readyState === 'loading') {\n      document.addEventListener('DOMContentLoaded', render);\n    } else {\n      render();\n    }\n  }\n\u003c/script\u003e","title":"我的 RSS 与书签工作流"},{"content":"破窑赋 [作者] 吕蒙正 [朝代] 宋代\n天有不测风云，人有旦夕祸福。蜈蚣百足，行不及蛇；雄鸡两翼，飞不过鸦。马有千里之程，无骑不能自往；人有冲天之志，非运不能自通。\n盖闻：人生在世，富贵不能淫，贫贱不能移。文章盖世，孔子厄于陈邦；武略超群，太公钓于渭水。颜渊命短，殊非凶恶之徒；盗跖年长，岂是善良之辈。尧帝明圣，却生不肖之儿；瞽叟愚顽，反生大孝之子。张良原是布衣，萧何称谓县吏。晏子身无五尺，封作齐国宰相；孔明卧居草庐，能作蜀汉军师。楚霸虽雄，败于乌江自刎；汉王虽弱，竟有万里江山。李广有射虎之威，到老无封；冯唐有乘龙之才，一生不遇。韩信未遇之时，无一日三餐，及至遇行，腰悬三尺玉印，一旦时衰，死于阴人之手。\n有先贫而后富，有老壮而少衰。满腹文章，白发竟然不中；才疏学浅，少年及第登科。深院宫娥，运退反为妓妾；风流妓女，时来配作夫人。\n青春美女，却招愚蠢之夫；俊秀郎君，反配粗丑之妇。蛟龙未遇，潜水于鱼鳖之间；君子失时，拱手于小人之下。衣服虽破，常存仪礼之容；面带忧愁，每抱怀安之量。时遭不遇，只宜安贫守份；心若不欺，必然扬眉吐气。初贫君子，天然骨骼生成；乍富小人，不脱贫寒肌体。\n天不得时，日月无光；地不得时，草木不生；水不得时，风浪不平；人不得时，利运不通。注福注禄，命里已安排定，富贵谁不欲？人若不依根基八字，岂能为卿为相？\n吾昔寓居洛阳，朝求僧餐，暮宿破窑，思衣不可遮其体，思食不可济其饥，上人憎，下人厌，人道我贱，非我不弃也。今居朝堂，官至极品，位置三公，身虽鞠躬于一人之下，而列职于千万人之上，有挞百僚之杖，有斩鄙吝之剑，思衣而有罗锦千箱，思食而有珍馐百味，出则壮士执鞭，入则佳人捧觞，上人宠，下人拥。人道我贵，非我之能也，此乃时也、运也、命也。\n嗟呼！人生在世，富贵不可尽用，贫贱不可自欺，听由天地循环，周而复始焉。\n无题 [作者] 无名\n陈事万千似寒霜, 傲雪梅来如故乡.\n终南别业 [作者] 王维 [朝代] 唐代\n中岁颇好道，晚家南山陲。 兴来每独往，胜事空自知。 行到水穷处，坐看云起时。 偶然值林叟，谈笑无还期。\n","permalink":"https://rmtt.github.io/zh/posts/gushici/gushici-02/","summary":"\u003ch3 id=\"破窑赋\"\u003e破窑赋\u003c/h3\u003e\n\u003cp\u003e[作者] 吕蒙正  [朝代] 宋代\u003c/p\u003e\n\u003cp\u003e天有不测风云，人有旦夕祸福。蜈蚣百足，行不及蛇；雄鸡两翼，飞不过鸦。马有千里之程，无骑不能自往；人有冲天之志，非运不能自通。\u003c/p\u003e\n\u003cp\u003e盖闻：人生在世，富贵不能淫，贫贱不能移。文章盖世，孔子厄于陈邦；武略超群，太公钓于渭水。颜渊命短，殊非凶恶之徒；盗跖年长，岂是善良之辈。尧帝明圣，却生不肖之儿；瞽叟愚顽，反生大孝之子。张良原是布衣，萧何称谓县吏。晏子身无五尺，封作齐国宰相；孔明卧居草庐，能作蜀汉军师。楚霸虽雄，败于乌江自刎；汉王虽弱，竟有万里江山。李广有射虎之威，到老无封；冯唐有乘龙之才，一生不遇。韩信未遇之时，无一日三餐，及至遇行，腰悬三尺玉印，一旦时衰，死于阴人之手。\u003c/p\u003e\n\u003cp\u003e有先贫而后富，有老壮而少衰。满腹文章，白发竟然不中；才疏学浅，少年及第登科。深院宫娥，运退反为妓妾；风流妓女，时来配作夫人。\u003c/p\u003e\n\u003cp\u003e青春美女，却招愚蠢之夫；俊秀郎君，反配粗丑之妇。蛟龙未遇，潜水于鱼鳖之间；君子失时，拱手于小人之下。衣服虽破，常存仪礼之容；面带忧愁，每抱怀安之量。时遭不遇，只宜安贫守份；心若不欺，必然扬眉吐气。初贫君子，天然骨骼生成；乍富小人，不脱贫寒肌体。\u003c/p\u003e\n\u003cp\u003e天不得时，日月无光；地不得时，草木不生；水不得时，风浪不平；人不得时，利运不通。注福注禄，命里已安排定，富贵谁不欲？人若不依根基八字，岂能为卿为相？\u003c/p\u003e\n\u003cp\u003e吾昔寓居洛阳，朝求僧餐，暮宿破窑，思衣不可遮其体，思食不可济其饥，上人憎，下人厌，人道我贱，非我不弃也。今居朝堂，官至极品，位置三公，身虽鞠躬于一人之下，而列职于千万人之上，有挞百僚之杖，有斩鄙吝之剑，思衣而有罗锦千箱，思食而有珍馐百味，出则壮士执鞭，入则佳人捧觞，上人宠，下人拥。人道我贵，非我之能也，此乃时也、运也、命也。\u003c/p\u003e\n\u003cp\u003e嗟呼！人生在世，富贵不可尽用，贫贱不可自欺，听由天地循环，周而复始焉。\u003c/p\u003e\n\u003ch3 id=\"无题\"\u003e无题\u003c/h3\u003e\n\u003cp\u003e[作者] 无名\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e陈事万千似寒霜, 傲雪梅来如故乡\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"终南别业\"\u003e终南别业\u003c/h3\u003e\n\u003cp\u003e[作者] 王维 [朝代] 唐代\u003c/p\u003e\n\u003cp\u003e中岁颇好道，晚家南山陲。\n兴来每独往，胜事空自知。\n\u003cstrong\u003e行到水穷处，坐看云起时\u003c/strong\u003e。\n偶然值林叟，谈笑无还期。\u003c/p\u003e","title":"古诗词日常收藏 - 2"},{"content":"MIT OS 课程地址: https://pdos.csail.mit.edu/6.S081/2020/schedule.html\n在拖沓了许久之后, 终于OS给看完了. 总体来说质量很不错, 设计的lab都很好, 理清了不少底层的概念.\n体验 个人觉得OS课程的lab至关重要, 这也是MIT 6.s081做得非常好的点之一, 他们的lab确实做到了由浅入深.\n理论知识是围绕xv6来讲解, 同时后期开始讲解OS的一些经典paper, 这些可以让自己对OS的学术领域有一个基本的了解.\n然后lab大部分都是修改xv6, 因为xv6的代码非常简洁, 所以修改一般都比较轻松. 难的是OS里面一个很小的细节可能要debug很久.\n加深了对所谓并发的理解, 多线程的lab是设计一个用户空间的\u0026quot;线程调度器\u0026quot;, 写完之后感觉对多线程/多进程的概念更清晰了, 虽然我觉得这里的多线程更像是协程.\n学习了一些经典的技术: copy-on-write, mmap, Read-Copy-Update\n看到meltdown的时候有点激动, 原作者是怎么想到这个做法的 (\n看了MIT 6.004之后惊叹数字电路上那么多精妙的设计, 现在看来OS里面也有很多精妙设计, 或者说是体系架构里面. 虽然MIT 6.004学习了页表, 但在OS里面可以看到页表的各种用法, 不得不佩服页表这个发明.\n知道了微内核和宏内核的区别\n总结 之前觉得一个CPU就是一个通用图灵机, 它的输入也是各种图灵机, 而其中之一就是OS, 而OS本身应该也是一个通用图灵机, 所以本质上OS是通过套娃提高了抽象层次, 简化了操作.\n现代OS的几个关键点应该是并发和安全. 对于并发, 常见的说法是多进程和多线程, 但实际上都是一回事, 只不过多线程是共享一个address space. 对于安全, 用页表来实现address space的隔离是个绝妙的idea, 虽然meltdown的出现吓到了不少人, 但这实际上也跟intel自己的micro-architecture实现有关, 好在现在已经可以在硬件层面修复了(不然还是得把用户空间和内核空间分开, 会拉低大概5%的性能).\n锁可以解决数据冲突, 但会降低并行性, 过度的使用等于没有并行.\n","permalink":"https://rmtt.github.io/zh/posts/mit-os/","summary":"\u003ch1 id=\"mit-os\"\u003eMIT OS\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://pdos.csail.mit.edu/6.S081/2020/schedule.html\"\u003ehttps://pdos.csail.mit.edu/6.S081/2020/schedule.html\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e在拖沓了许久之后, 终于OS给看完了. 总体来说质量很不错, 设计的lab都很好, 理清了不少底层的概念.\u003c/p\u003e\n\u003ch2 id=\"体验\"\u003e体验\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e个人觉得OS课程的lab至关重要, 这也是MIT 6.s081做得非常好的点之一, 他们的lab确实做到了由浅入深.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e理论知识是围绕xv6来讲解, 同时后期开始讲解OS的一些经典paper, 这些可以让自己对OS的学术领域有一个基本的了解.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e然后lab大部分都是修改xv6, 因为xv6的代码非常简洁, 所以修改一般都比较轻松. 难的是OS里面一个很小的细节可能要debug很久.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e加深了对所谓并发的理解, 多线程的lab是设计一个用户空间的\u0026quot;线程调度器\u0026quot;, 写完之后感觉对多线程/多进程的概念更清晰了, 虽然我觉得这里的多线程更像是协程.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e学习了一些经典的技术: copy-on-write, mmap, Read-Copy-Update\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e看到meltdown的时候有点激动, 原作者是怎么想到这个做法的 (\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e看了MIT 6.004之后惊叹数字电路上那么多精妙的设计, 现在看来OS里面也有很多精妙设计, 或者说是体系架构里面. 虽然MIT 6.004学习了页表, 但在OS里面可以看到页表的各种用法, 不得不佩服页表这个发明.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e知道了微内核和宏内核的区别\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"总结\"\u003e总结\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e之前觉得一个CPU就是一个通用图灵机, 它的输入也是各种图灵机, 而其中之一就是OS, 而OS本身应该也是一个通用图灵机, 所以本质上OS是通过套娃提高了抽象层次, 简化了操作.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e现代OS的几个关键点应该是并发和安全. 对于并发, 常见的说法是多进程和多线程, 但实际上都是一回事, 只不过多线程是共享一个address space. 对于安全, 用页表来实现address space的隔离是个绝妙的idea, 虽然meltdown的出现吓到了不少人, 但这实际上也跟intel自己的micro-architecture实现有关, 好在现在已经可以在硬件层面修复了(不然还是得把用户空间和内核空间分开, 会拉低大概5%的性能).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e锁可以解决数据冲突, 但会降低并行性, 过度的使用等于没有并行.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e","title":"MIT 6.s081(Operating System)"},{"content":"Parallel Processing 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c21/c21s1/\n本章讲的是各种并行方案.\n并行 并行大体上有如下3种:\n指令级并行(ILP) 数据级并行(DLP) 线程级并行(TLP) 指令级并行 指令级并行是让流行线的每个阶段尽可能同时执行多条指令.\n数据级并行 数据级并行主要是指像向量加法这种计算, 天生就能拆开运算的! 只需要提供多个ALU就行了, 目前主要是由GPU来做.\n线程级并行 首先介绍一下阿姆达尔定律:\n一个线程就是在一个core上执行的计算任务.\nUsing multiple independent cores to execute a parallel task is called thread-level parallelism (TLP), where each core executes a separate computation “thread”.\n不同的Core之间是通过同一个main memory来交换数据(还有更高效的MPI), 而且每个core都有自己的cache.\n为了保证数据的一致性, 在cache和内存之间也有一条bus来监测cache的变化和同步.\n例如MESI protocal: https://en.wikipedia.org/wiki/MESI_protocol\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-21/","summary":"\u003ch1 id=\"parallel-processing\"\u003eParallel Processing\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c21/c21s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c21/c21s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章讲的是各种并行方案.\u003c/p\u003e\n\u003ch2 id=\"并行\"\u003e并行\u003c/h2\u003e\n\u003cp\u003e并行大体上有如下3种:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e指令级并行(ILP)\u003c/li\u003e\n\u003cli\u003e数据级并行(DLP)\u003c/li\u003e\n\u003cli\u003e线程级并行(TLP)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"指令级并行\"\u003e指令级并行\u003c/h3\u003e\n\u003cp\u003e指令级并行是让流行线的每个阶段尽可能同时执行多条指令.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-21/superscalar-processor.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"数据级并行\"\u003e数据级并行\u003c/h3\u003e\n\u003cp\u003e数据级并行主要是指像向量加法这种计算, 天生就能拆开运算的! 只需要提供多个ALU就行了, 目前主要是由GPU来做.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-21/data-level-parallelism.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"线程级并行\"\u003e线程级并行\u003c/h3\u003e\n\u003cp\u003e首先介绍一下阿姆达尔定律:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-21/amdahl-law.png\"\u003e\u003c/p\u003e\n\u003cp\u003e一个线程就是在一个core上执行的计算任务.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eUsing multiple independent cores to execute a parallel task is called thread-level parallelism (TLP), where each core executes a separate computation “thread”.\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-21/thread-level-parallelism.png\"\u003e\u003c/p\u003e\n\u003cp\u003e不同的Core之间是通过同一个main memory来交换数据(还有更高效的MPI), 而且每个core都有自己的cache.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-21/multi-core-caches.png\"\u003e\u003c/p\u003e\n\u003cp\u003e为了保证数据的一致性, 在cache和内存之间也有一条bus来监测cache的变化和同步.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e例如MESI protocal: \u003ca href=\"https://en.wikipedia.org/wiki/MESI_protocol\"\u003ehttps://en.wikipedia.org/wiki/MESI_protocol\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e","title":"Parallel Processing"},{"content":"System-level Communication 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c20/c20s1/\n本章主要讲的是系统间通信, 按现在来讲就是总线(BUS).\n前面讲了很多硬核的物理知识, 证明了单一总线因为传输线反射的问题, 无法做到高频.\n后面介绍了PCIe, 原来PCIe是受Network的启发, 也搞了一套点对点的通信协议, 跟网络一样分了几层, 数据也是包装成packet发出去.\n跟网络一样, PCIe也可以有多种top, 比如环形, 树形等等.\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-20/","summary":"\u003ch1 id=\"system-level-communication\"\u003eSystem-level Communication\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c20/c20s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c20/c20s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要讲的是系统间通信, 按现在来讲就是总线(BUS).\u003c/p\u003e\n\u003cp\u003e前面讲了很多硬核的物理知识, 证明了单一总线因为传输线反射的问题, 无法做到高频.\u003c/p\u003e\n\u003cp\u003e后面介绍了PCIe, 原来PCIe是受Network的启发, 也搞了一套点对点的通信协议, 跟网络一样分了几层, 数据也是包装成packet发出去.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-20/pcie.png\"\u003e\u003c/p\u003e\n\u003cp\u003e跟网络一样, PCIe也可以有多种top, 比如环形, 树形等等.\u003c/p\u003e","title":"System-level Communication"},{"content":"Concurrency and Synchronization 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c19/c19s1/\n本章主要是讲进程间通信(IPC), 不过是从硬件的角度来看.\nIPC里面常用的信号量, 其实也只是在共享内存中存入了一个数字, 而所谓的lock, 也只是数量为1的semaphore.\n但是如果不同core上的进程同时对同一个内存地址进行写操作的话, 会产生冲突吗? 这个貌似是内存或者总线去解决的, 目前还没找到具体实现, 先mark一下.\nIPC的一个重要问题是deadlock, 比如进程A和进程B:\n# 进程A wait(x) wait(y) # 进程B wait(y) wait(x) 当进程A执行完wait(x)后, 进程B被调度, 而且执行了wait(y), 显然这两个进程永远都无法结束.\n一个比较直观而且简单的方案是对IPC中需要用到的信号量进行排序, 在进程wait时, 总是先wait顺序在前的信号量.\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-19/","summary":"\u003ch1 id=\"concurrency-and-synchronization\"\u003eConcurrency and Synchronization\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c19/c19s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c19/c19s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要是讲进程间通信(IPC), 不过是从硬件的角度来看.\u003c/p\u003e\n\u003cp\u003eIPC里面常用的信号量, 其实也只是在共享内存中存入了一个数字, 而所谓的lock, 也只是数量为1的semaphore.\u003c/p\u003e\n\u003cp\u003e但是如果不同core上的进程同时对同一个内存地址进行写操作的话, 会产生冲突吗? 这个貌似是内存或者总线去解决的, 目前还没找到具体实现, 先mark一下.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-19/hardware-support-semaphore.png\"\u003e\u003c/p\u003e\n\u003cp\u003eIPC的一个重要问题是deadlock, 比如进程A和进程B:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 进程A\nwait(x)\nwait(y)\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# 进程B\nwait(y)\nwait(x)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e当进程A执行完\u003ccode\u003ewait(x)\u003c/code\u003e后, 进程B被调度, 而且执行了\u003ccode\u003ewait(y)\u003c/code\u003e, 显然这两个进程永远都无法结束.\u003c/p\u003e\n\u003cp\u003e一个比较直观而且简单的方案是对IPC中需要用到的信号量进行排序, 在进程\u003ccode\u003ewait\u003c/code\u003e时, 总是先\u003ccode\u003ewait\u003c/code\u003e顺序在前的信号量.\u003c/p\u003e","title":"Concurrency and Synchronization"},{"content":"Devices and Interrupts 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c18/c18s1/\n本章引入外设, 讲解了round-robin调度算法的优缺点.\n首先, \u0026ldquo;IO阻塞\u0026quot;的本质是什么?\n当IO请求没有收到回复时, OS在调度到该进程时还是会继续执行等待IO的指令.\n虽然每次调度到正在等待IO的进程也花不了多少条指令, 但还是要切换上下文啥的, 为了提高轮询的效率, 我们可以想办法让这些等待IO的进程不会被调度.\n我们可以将进程分为不同的状态, 只有状态为0的进程可以被正常调度.\n当进程开始等待IO时, 便用 sleep(id) 来改变进程的状态, 其中 id 相当于这个IO资源的标识符, 比如可以有多个进程都在等待键盘的输入. 当相应的IO时间响应后, 再根据这个id去恢复进程的状态.\n加了状态的轮询调度感觉也挺合理的!\n那么, 轮询能满足所有的任务吗? 当然是不能!\n某些特殊的系统, 例如车载系统, 会有一些特别紧急的中断必须要优先执行, 比如紧急制动啥的. 按我们之前的设计, 中断都是在内核态中执行, 而内核态会禁用中断, 所以当需要紧急制动时, 巧好有一个耗时较长的中断在执行, 可能就会引发悲剧!\n像这种每个中断都要及时响应或者在一定时间内执行完成的, 一般称为实时调度.\n本章介绍了弱优先级抢占和强优先级抢占两种调度算法. 区别就是当前的中断是否能被高优先级的中断中断 (\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-18/","summary":"\u003ch1 id=\"devices-and-interrupts\"\u003eDevices and Interrupts\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c18/c18s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c18/c18s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章引入外设, 讲解了round-robin调度算法的优缺点.\u003c/p\u003e\n\u003cp\u003e首先, \u0026ldquo;IO阻塞\u0026quot;的本质是什么?\u003c/p\u003e\n\u003cp\u003e当IO请求没有收到回复时, OS在调度到该进程时还是会继续执行等待IO的指令.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-18/readkey-svc-3.png\"\u003e\u003c/p\u003e\n\u003cp\u003e虽然每次调度到正在等待IO的进程也花不了多少条指令, 但还是要切换上下文啥的, 为了提高轮询的效率, 我们可以想办法让这些等待IO的进程不会被调度.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-18/readkey-svc-4.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们可以将进程分为不同的状态, 只有状态为0的进程可以被正常调度.\u003c/p\u003e\n\u003cp\u003e当进程开始等待IO时, 便用 \u003ccode\u003esleep(id)\u003c/code\u003e 来改变进程的状态, 其中 \u003ccode\u003eid\u003c/code\u003e 相当于这个IO资源的标识符, 比如可以有多个进程都在等待键盘的输入. 当相应的IO时间响应后, 再根据这个\u003ccode\u003eid\u003c/code\u003e去恢复进程的状态.\u003c/p\u003e\n\u003cp\u003e加了状态的轮询调度感觉也挺合理的!\u003c/p\u003e\n\u003cp\u003e那么, 轮询能满足所有的任务吗? 当然是不能!\u003c/p\u003e\n\u003cp\u003e某些特殊的系统, 例如车载系统, 会有一些特别紧急的中断必须要优先执行, 比如紧急制动啥的. 按我们之前的设计, 中断都是在内核态中执行, 而内核态会禁用中断, 所以当需要紧急制动时, 巧好有一个耗时较长的中断在执行, 可能就会引发悲剧!\u003c/p\u003e\n\u003cp\u003e像这种每个中断都要及时响应或者在一定时间内执行完成的, 一般称为实时调度.\u003c/p\u003e\n\u003cp\u003e本章介绍了弱优先级抢占和强优先级抢占两种调度算法. 区别就是当前的中断是否能被高优先级的中断中断 (\u003c/p\u003e","title":"Devices and Interrupts"},{"content":"Virtualizing the Processor 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c17/c17s1/\n本章讲了CPU的\u0026quot;虚拟化\u0026quot;, 不过这里的\u0026quot;虚拟化\u0026quot;是指在同一个CPU上执行多个程序, 并且互不干扰, 重点当然就是虚拟内存和MMU啦.\n现代CPU都在硬件上实现了内核态和用户态, 所以无法单纯靠软件来实现内核态和用户态的切换, 而是要靠CPU的中断来实现.\n当Timer发起一个中断时, 我们调用OS的schedule程序来切换用户程序的上下文, 那么具体需要切换哪些内容呢? 常见的就是所有寄存器的内容, MMU的Context和Page Directory/Page Map的base pointer, 还有其他各种外设的状态等等, 比如该用户程序的输入应该在哪个tty.\n这种代码+上下文+所有相关资源的集合便是一个进程(Process).\n众所周知, OS提供的底层接口都是在内核态运行, 因为内核态不会受中断的干扰, 所以能够保持调度器一直能正常运行. 但是CPU是禁止程序从用户态直接转移到内核态的, 唯一的办法便是通过中断或者异常.\n现代的CPU都运行设置部分中断和异常的Handler, 当用户态程序有中断或异常产生时, 便会跳转到相应的Handler去执行, 而且会无视用户态/内核态的区别. 所以, OS可以指定自己的异常处理Handler, 对于每一个系统调用, 都分配一个illegal-opcode就可以啦!\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-17/","summary":"\u003ch1 id=\"virtualizing-the-processor\"\u003eVirtualizing the Processor\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c17/c17s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c17/c17s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章讲了CPU的\u0026quot;虚拟化\u0026quot;, 不过这里的\u0026quot;虚拟化\u0026quot;是指在同一个CPU上执行多个程序, 并且互不干扰, 重点当然就是虚拟内存和MMU啦.\u003c/p\u003e\n\u003cp\u003e现代CPU都在硬件上实现了内核态和用户态, 所以无法单纯靠软件来实现内核态和用户态的切换, 而是要靠CPU的中断来实现.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-17/timer-interrupts.png\"\u003e\u003c/p\u003e\n\u003cp\u003e当Timer发起一个中断时, 我们调用OS的schedule程序来切换用户程序的上下文, 那么具体需要切换哪些内容呢? 常见的就是所有寄存器的内容, MMU的Context和Page Directory/Page Map的base pointer, 还有其他各种外设的状态等等, 比如该用户程序的输入应该在哪个tty.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-17/simple-timesharing-scheduler.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这种代码+上下文+所有相关资源的集合便是一个进程(Process).\u003c/p\u003e\n\u003cp\u003e众所周知, OS提供的底层接口都是在内核态运行, 因为内核态不会受中断的干扰, 所以能够保持调度器一直能正常运行. 但是CPU是禁止程序从用户态直接转移到内核态的, 唯一的办法便是通过中断或者异常.\u003c/p\u003e\n\u003cp\u003e现代的CPU都运行设置部分中断和异常的Handler, 当用户态程序有中断或异常产生时, 便会跳转到相应的Handler去执行, 而且会无视用户态/内核态的区别. 所以, OS可以指定自己的异常处理Handler, 对于每一个系统调用, 都分配一个illegal-opcode就可以啦!\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-17/illop-handler.png\"\u003e\u003c/p\u003e","title":"Virtualizing the Processor"},{"content":"Virtual Memory 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c16/c16s1/\n本章主要讲了从硬盘加载数据到主存的策略, 从而引出了虚拟内存和页表.\nExtending the memory hierarchy Virtual Memory Page Map Translation look-aside buffer (TLB) Context Summary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-16/","summary":"\u003ch1 id=\"virtual-memory\"\u003eVirtual Memory\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c16/c16s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c16/c16s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要讲了从硬盘加载数据到主存的策略, 从而引出了虚拟内存和页表.\u003c/p\u003e\n\u003ch2 id=\"extending-the-memory-hierarchy\"\u003eExtending the memory hierarchy\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/extending-the-memory-hierarchy.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/impact-of-enormous-miss-penalty.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"virtual-memory-1\"\u003eVirtual Memory\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/virtual-memory.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/paging.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/demand-paging.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"page-map\"\u003ePage Map\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/simple-page-map-design.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/example-vtop.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/page-fault.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/example-page-fault.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"translation-look-aside-buffer-tlb\"\u003eTranslation look-aside buffer (TLB)\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/tlb.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/mmu-address-translation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/mmu-with-tlb.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"context\"\u003eContext\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/contexts.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/memory-management-and-protection.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/multi-level-maps.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/rapid-context.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/best-of-both-worlds.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-16/virtual-memory-summary.png\"\u003e\u003c/p\u003e","title":"Virtual Memory"},{"content":"Pipelining the Beta 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c15/c15s1/\n本章主要是讲如何讲前面做的Beta cpu流水线化, 以及如何解决流水线中会遇到的数据冲突/控制逻辑冲突等等.\nPS: 这章内容是真多 (\n流水线化 冲突 常见的冲突有两种,即数据冲突和控制逻辑冲突. 数据冲突是指当前指令需要的数据暂时还没有写回寄存器或者内存, 控制逻辑冲突是指当要跳转的指令的地址还没计算出来时, 下一个指令的地址应该是多少.\n数据冲突 Strategy 1 - Stall Stall就是当指令运行到流水线的某一个阶段时, 如果检测到需要的数据还没有写回寄存器或者内存, 就在这个阶段阻塞住, 而且前面阶段的指令也要同时阻塞住, 阻塞的同时给下一阶段的IR寄存器输出NOP.\nStrategy 2 - Bypass 虽然每个指令只有在最后的Write Back阶段才会把数据写回寄存器或者内存, 但相关的值在前面的阶段就已经计算出来了, 所以可以直接把这些值bypass到可能需要的地方.\n控制逻辑冲突 Stratege 1和2跟前面数据冲突的处理一样, 这里只记录一下第三个做法, 也就是分支预测.\n分支预测 Exception and Interruption ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-15/","summary":"\u003ch1 id=\"pipelining-the-beta\"\u003ePipelining the Beta\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c15/c15s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c15/c15s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要是讲如何讲前面做的Beta cpu流水线化, 以及如何解决流水线中会遇到的数据冲突/控制逻辑冲突等等.\u003c/p\u003e\n\u003cp\u003ePS: 这章内容是真多 (\u003c/p\u003e\n\u003ch2 id=\"流水线化\"\u003e流水线化\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/pipelined-implementation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/too-long-course.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"冲突\"\u003e冲突\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/pipeline-hazards.png\"\u003e\u003c/p\u003e\n\u003cp\u003e常见的冲突有两种,即数据冲突和控制逻辑冲突. 数据冲突是指当前指令需要的数据暂时还没有写回寄存器或者内存, 控制逻辑冲突是指当要跳转的指令的地址还没计算出来时, 下一个指令的地址应该是多少.\u003c/p\u003e\n\u003ch3 id=\"数据冲突\"\u003e数据冲突\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/data-hazards.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/resolving-data-hazards.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"strategy-1---stall\"\u003eStrategy 1 - Stall\u003c/h4\u003e\n\u003cp\u003eStall就是当指令运行到流水线的某一个阶段时, 如果检测到需要的数据还没有写回寄存器或者内存, 就在这个阶段阻塞住, 而且前面阶段的指令也要同时阻塞住,  阻塞的同时给下一阶段的IR寄存器输出NOP.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/resolving-data-hazard-1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/stall-logic.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/resolving-data-hazard-2.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"strategy-2---bypass\"\u003eStrategy 2 - Bypass\u003c/h4\u003e\n\u003cp\u003e虽然每个指令只有在最后的Write Back阶段才会把数据写回寄存器或者内存, 但相关的值在前面的阶段就已经计算出来了, 所以可以直接把这些值bypass到可能需要的地方.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/bypass-logic.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/fully-bypassed-pipeline.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"控制逻辑冲突\"\u003e控制逻辑冲突\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/control-hazard-1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/control-hazard-2.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/resolving-control-hazards.png\"\u003e\u003c/p\u003e\n\u003cp\u003eStratege 1和2跟前面数据冲突的处理一样, 这里只记录一下第三个做法, 也就是分支预测.\u003c/p\u003e\n\u003ch4 id=\"分支预测\"\u003e分支预测\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/resolving-hazards-with-speculation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/branch-prediction.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"exception-and-interruption\"\u003eException and Interruption\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-15/exception-and-interrupt-logic.png\"\u003e\u003c/p\u003e","title":"Pipelining the Beta"},{"content":"Caches and the Memory Hierarchy 课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c14/c14s1/\n本章主要讲了SRAM、DRAM、Flash、HDD的原理和现代CPU的缓存架构。\n存储设备 PS: 片上的存储设备一般都有bitline和wordline, wordline用来激活指定的存储单元，bitline用来读/写数据。\nSRAM SRAM跟寄存器比较像，都是用正反馈是保持电压。\nDRAM DRAM是使用电容来保持电压，体积更小，所以容量更大，但访问速度比SRAM慢，而且需要定时刷新存储的数据。\nFlash Flash是使用MOSFET来存储数据，在栅极下加了一层绝缘体，讲电子导入绝缘体，然后根据绝缘体的带电大小来决定数据。\nHard Disk 硬盘（这里指机械硬盘）是用磁化来存储数据。\n内存系统 在现代CPU的架构中，主存一般是速度相对较慢但是体积更小的DRAM组成。不过CPU不会直接跟主存交换数据，在中间可能会有其他几层SRAM来充当缓存，以降低内存的平均访问时间。\n但从编程的角度看，有这样两种选择。一是完全隐藏缓存的细节，这样写程序时便可以把内存当成一个单独的设备使用；二是公开缓存细节，由programmer去决定哪些数据放在缓存，哪些放在主存。\n现在除了超算，基本都是选择隐藏缓存的细节。\nCache策略 既然要隐藏缓存的细节，那么需要用硬件或者软件来自动控制哪些数据应该放在缓存，当缓存命中时，直接返回给CPU，未命中时，缓存应当自主去主存读数据然后缓存起来并返回给CPU. 下面来讨论一下具体的缓存策略.\n前提 在模拟测试中, 可以发现这样一个事实:\nDirect-Mapped Full-Associative Set-Associative Policies Replacement Policies Write Policy Summary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-14/","summary":"\u003ch1 id=\"caches-and-the-memory-hierarchy\"\u003eCaches and the Memory Hierarchy\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c14/c14s1/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要讲了\u003cem\u003eSRAM\u003c/em\u003e、\u003cem\u003eDRAM\u003c/em\u003e、Flash、HDD的原理和现代CPU的缓存架构。\u003c/p\u003e\n\u003ch2 id=\"存储设备\"\u003e存储设备\u003c/h2\u003e\n\u003cp\u003ePS: 片上的存储设备一般都有bitline和wordline, wordline用来激活指定的存储单元，bitline用来读/写数据。\u003c/p\u003e\n\u003ch3 id=\"sram\"\u003eSRAM\u003c/h3\u003e\n\u003cp\u003eSRAM跟寄存器比较像，都是用正反馈是保持电压。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/static-ram.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/sram-cell.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/sram-read.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"sram-write\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/sram-write.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"dram\"\u003eDRAM\u003c/h3\u003e\n\u003cp\u003eDRAM是使用电容来保持电压，体积更小，所以容量更大，但访问速度比SRAM慢，而且需要定时刷新存储的数据。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/dram-cell.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/dram-write-and-read.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"flash\"\u003eFlash\u003c/h3\u003e\n\u003cp\u003eFlash是使用MOSFET来存储数据，在栅极下加了一层绝缘体，讲电子导入绝缘体，然后根据绝缘体的带电大小来决定数据。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/flash.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"hard-disk\"\u003eHard Disk\u003c/h3\u003e\n\u003cp\u003e硬盘（这里指机械硬盘）是用磁化来存储数据。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/hard-disk.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"内存系统\"\u003e内存系统\u003c/h2\u003e\n\u003cp\u003e在现代CPU的架构中，主存一般是速度相对较慢但是体积更小的DRAM组成。不过CPU不会直接跟主存交换数据，在中间可能会有其他几层SRAM来充当缓存，以降低内存的平均访问时间。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/the-memory-hierarchy.png\"\u003e\u003c/p\u003e\n\u003cp\u003e但从编程的角度看，有这样两种选择。一是完全隐藏缓存的细节，这样写程序时便可以把内存当成一个单独的设备使用；二是公开缓存细节，由programmer去决定哪些数据放在缓存，哪些放在主存。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/memory-hierarchy-interface.png\"\u003e\u003c/p\u003e\n\u003cp\u003e现在除了超算，基本都是选择隐藏缓存的细节。\u003c/p\u003e\n\u003ch2 id=\"cache策略\"\u003eCache策略\u003c/h2\u003e\n\u003cp\u003e既然要隐藏缓存的细节，那么需要用硬件或者软件来自动控制哪些数据应该放在缓存，当缓存命中时，直接返回给CPU，未命中时，缓存应当自主去主存读数据然后缓存起来并返回给CPU. 下面来讨论一下具体的缓存策略.\u003c/p\u003e\n\u003ch3 id=\"前提\"\u003e前提\u003c/h3\u003e\n\u003cp\u003e在模拟测试中, 可以发现这样一个事实:\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/the-locality-property.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/memory-reference-patterns.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"direct-mapped\"\u003eDirect-Mapped\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/direct-mapped.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/block-size.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"full-associative\"\u003eFull-Associative\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/full-associative-cache.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"set-associative\"\u003eSet-Associative\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/n-way-associative-cache.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"policies\"\u003ePolicies\u003c/h2\u003e\n\u003ch3 id=\"replacement-policies\"\u003eReplacement Policies\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/replacement-policies.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"write-policy\"\u003eWrite Policy\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/write-policy.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/write-back.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-14/cache-summary.png\"\u003e\u003c/p\u003e","title":"Caches and the Memory Hierarchy"},{"content":"Building the Beta 课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c13/c13s1/\n本章主要是介绍如何实现一个beta处理器，应该是一个实验课，所以没啥要记录的（\nPS: 对着一堆逻辑门Debug了一整天终于把所有测试都通过了！累死人（\nLab地址：https://computationstructures.org/exercises/beta/lab.html\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-13/","summary":"\u003ch1 id=\"building-the-beta\"\u003eBuilding the Beta\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c13/c13s1/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章主要是介绍如何实现一个beta处理器，应该是一个实验课，所以没啥要记录的（\u003c/p\u003e\n\u003cp\u003ePS: 对着一堆逻辑门Debug了一整天终于把所有测试都通过了！累死人（\u003c/p\u003e\n\u003cp\u003eLab地址：https://computationstructures.org/exercises/beta/lab.html\u003c/p\u003e","title":"Building the Beta"},{"content":"Compilers 课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c11/\n本章就是讲了一些简单的编译原理的内容，内容比较简单，就不多记录了。\n控制流图(CFG)是常用的IR\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-11/","summary":"\u003ch1 id=\"compilers\"\u003eCompilers\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c11/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章就是讲了一些简单的编译原理的内容，内容比较简单，就不多记录了。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e控制流图(CFG)是常用的IR\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-11/modern-compilers.png\"\u003e\u003c/p\u003e","title":"Compilers"},{"content":"Procedures and Stacks 课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c12/c12s1/\n本章的主要内容是讲解了为什么需要Procedures和Stacks, 应该是第一次这么清晰的理解栈（\nProcedures Procedures就是一组指令的集合，目的是为了重用指令，节约空间。当然，在高级变成语言里面都叫函数或者方法。\n这里从汇编的角度来考虑如何实现Procedure, 一个最简单的办法是将Procedure在编译的时候展开，这样虽然重用了指令，但是并没有节省空间，而且无法递归调用！\n另一个比较好的做法是记录Procedure的开始位置，在需要调用的时候只需要把PC设置成Procedure的地址就可以了，这样即能重用指令，也能节省空间，还能递归调用！不过问题也随之而来，当Procedure运行完后，如何知道应该返回到哪里继续执行呢？Procedure所需要的参数该如何传递呢？\n首先，在执行分支指令的时候，会自动计算$PC + 4$并存在指定的寄存器，所以我们可以在Procedure里面拿到要返回的地址。其次，我们可以固定几个寄存器来传递参数，比如R3 ~ R6。这样做的话，似乎可以正确执行procedure, 但是，一旦有递归调用，那这些指定的寄存器都会被覆盖，当递归最后一层结束后返回上一层时，整个调用链就“断掉”了！\n而且，当procedure的参数变多时，寄存器根本不够用！\nStacks 有了上述的问题之后，让我们再来思考一下procedure的调用需要那些工作来完成。\n首先我们需要知道Procedure的参数、返回值以及结束后PC的值，其次是procedure里面的局部变量应该存在哪里，因为在procedure执行完后，这些局部变量应该要被完全清除。我们的目标是在procedure执行过程中不会影响caller的数据，在执行完成后回到caller的时候，各个寄存器除了存放返回值的那个外，都应该是调用procedure前的状态！我们把这些在每次procedure调用时都需要记录的东西称为Activation Record。\n下图演示了在递归调用时，Activation Record应该是如何变化的。\n这不就是先进后出的Stack嘛！然后就是一系列的有关于Stack的定义了。\nStack frame 现在我们用Stack来解决之前的问题了！\n我们可以把procedure的参数，局部变量，以及procedure要使用的寄存器的内容都存到stack了！除此之外，我们还需要一些特殊的记录，比如procedure执行完后该返回的地址以及一个可以随时在栈中寻址的指针。然后，约定一个顺序来存这些数据就可以了！\n栈中一个procedure的相关数据都在连续的区块中，我们称这个区块为stack frame.\n然后约定好caller和callee的职责，就可以开心地使用procedure啦！\nCompile procedure 如下是将C的一个递归调用编译成汇编的例子。\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-12/","summary":"\u003ch1 id=\"procedures-and-stacks\"\u003eProcedures and Stacks\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c12/c12s1/\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章的主要内容是讲解了为什么需要Procedures和Stacks, 应该是第一次这么清晰的理解栈（\u003c/p\u003e\n\u003ch2 id=\"procedures\"\u003eProcedures\u003c/h2\u003e\n\u003cp\u003eProcedures就是一组指令的集合，目的是为了重用指令，节约空间。当然，在高级变成语言里面都叫函数或者方法。\u003c/p\u003e\n\u003cp\u003e这里从汇编的角度来考虑如何实现Procedure, 一个最简单的办法是将Procedure在编译的时候展开，这样虽然重用了指令，但是并没有节省空间，而且无法递归调用！\u003c/p\u003e\n\u003cp\u003e另一个比较好的做法是记录Procedure的开始位置，在需要调用的时候只需要把PC设置成Procedure的地址就可以了，这样即能重用指令，也能节省空间，还能递归调用！不过问题也随之而来，当Procedure运行完后，如何知道应该返回到哪里继续执行呢？Procedure所需要的参数该如何传递呢？\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/implementing-procedures.png\"\u003e\u003c/p\u003e\n\u003cp\u003e首先，在执行分支指令的时候，会自动计算$PC + 4$并存在指定的寄存器，所以我们可以在Procedure里面拿到要返回的地址。其次，我们可以固定几个寄存器来传递参数，比如R3 ~ R6。这样做的话，似乎可以正确执行procedure, 但是，一旦有递归调用，那这些指定的寄存器都会被覆盖，当递归最后一层结束后返回上一层时，整个调用链就“断掉”了！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-calling-concention.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-linkage-first-try.png\"\u003e\u003c/p\u003e\n\u003cp\u003e而且，当procedure的参数变多时，寄存器根本不够用！\u003c/p\u003e\n\u003ch2 id=\"stacks\"\u003eStacks\u003c/h2\u003e\n\u003cp\u003e有了上述的问题之后，让我们再来思考一下procedure的调用需要那些工作来完成。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-storage-needs.png\"\u003e\u003c/p\u003e\n\u003cp\u003e首先我们需要知道Procedure的参数、返回值以及结束后PC的值，其次是procedure里面的局部变量应该存在哪里，因为在procedure执行完后，这些局部变量应该要被完全清除。我们的目标是在procedure执行过程中不会影响caller的数据，在执行完成后回到caller的时候，各个寄存器除了存放返回值的那个外，都应该是调用procedure前的状态！我们把这些在每次procedure调用时都需要记录的东西称为Activation Record。\u003c/p\u003e\n\u003cp\u003e下图演示了在递归调用时，Activation Record应该是如何变化的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/activation-record.png\"\u003e\u003c/p\u003e\n\u003cp\u003e这不就是先进后出的Stack嘛！然后就是一系列的有关于Stack的定义了。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/we-need-a-stack.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/stack-implementation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/stack-management-macros.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"stack-frame\"\u003eStack frame\u003c/h2\u003e\n\u003cp\u003e现在我们用Stack来解决之前的问题了！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/solving-procedure-linkage-problems.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们可以把procedure的参数，局部变量，以及procedure要使用的寄存器的内容都存到stack了！除此之外，我们还需要一些特殊的记录，比如procedure执行完后该返回的地址以及一个可以随时在栈中寻址的指针。然后，约定一个顺序来存这些数据就可以了！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/stack-frame-as-activation-record.png\"\u003e\u003c/p\u003e\n\u003cp\u003e栈中一个procedure的相关数据都在连续的区块中，我们称这个区块为stack frame.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/stack-frame-details.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/arguments-order-and-bp-usage.png\"\u003e\u003c/p\u003e\n\u003cp\u003e然后约定好caller和callee的职责，就可以开心地使用procedure啦！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-linkage-contract.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-linkage-template.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"compile-procedure\"\u003eCompile procedure\u003c/h2\u003e\n\u003cp\u003e如下是将C的一个递归调用编译成汇编的例子。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-factorial.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/recursion.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/stack-detective.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-12/procedure-stack-summary.png\"\u003e\u003c/p\u003e","title":"Procedures and Stacks"},{"content":"Assembly Language 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c10/c10s1/\n汇编语言是对指令集的抽象，用一些单词的缩写来替代指令集的opcode, 从而更容易记忆和理解。\n本课程中使用的汇编语言叫USAM，课程Lab里面有详细的cookbook, 就不再记录了，下面主要记录图灵机相关的内容。\nFSM的局限 FSM是一个很强大的计算模型，前面章节中我们已经用电路实现了通用FSM, 那么FSM是否可以计算所有能用数字设备计算的功能或者说函数呢？\n答案是不能，比如简单的括号匹配。因为FSM要靠状态来记住(和)的个数，当有一个长度无穷大的序列时，FSM便无法构造。\n为了解决这个问题，Alan turing提出了图灵机的模型。\n图灵机 图灵机的核心还是FSM, 不过现在多了一条无限长的纸带，FSM可以通过存储在纸带上的符号来记录额外的信息，从而避免了状态数过多而无法构造FSM的问题。\n因为一段纸带上的符号可以被编码为一个整数，所以图灵机就是一个整数函数$y = TM_I(x)$。\n其中$I$是用来标识特定功能即有特定FSM的图灵机，我们可以将FSM的真值表编码成数字来表示$I$。\nChurch\u0026rsquo;s Thesis $f(x) computable \u003c=\u003e for some k, all x f(x) = T_k[x]$\n该定理由图灵的老师Church提出，但目前并没有证明，不过已经被普遍接受（可能是还没找到反例吧）。\n通用图灵机 对于不同的计算任务，其构造的FSM不同，所构造的图灵机便也不同，那么为了各种计算任务，就需要构造各种各样的图灵机（实际上只有FSM不同）。那么存在一种或者一个图灵机，能够计算所有图灵机能计算的函数吗？\n从21世纪的结果来看，当然是存在的！\n如上图所示，$U(k, j) = T_k[j]$是一个Universal Function, 实现这个函数的图灵机便是通用图灵机。\n实际上，这里的关键在于$k$。\n$k$在这里是表示program，理论上讲就是对FSM的编码，比如用FSM的真值表来编码，而从上层计算机的角度来讲的话，$k$就是可执行的二进制程序，而PC本身就是一个通用图灵机！通用图灵机的计算便是对$k$的interpret，实际上就是把$k$本身的计算步骤走一遍。\n现在的各种编码算法，实际上就是把一个FSM编码成整数从而输入给通用图灵机。\n不过由于内存的空间是有限的，所以实际中的计算机还是只能计算数据量不超过内存大小的任务。\nUncomputability 如下是一个不可计算函数的例子，也就是所谓的图灵停机问题。\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-10/","summary":"\u003ch1 id=\"assembly-language\"\u003eAssembly Language\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c10/c10s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c10/c10s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e汇编语言是对指令集的抽象，用一些单词的缩写来替代指令集的opcode, 从而更容易记忆和理解。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/assembly-language.png\"\u003e\u003c/p\u003e\n\u003cp\u003e本课程中使用的汇编语言叫\u003cem\u003eUSAM\u003c/em\u003e，课程Lab里面有详细的cookbook, 就不再记录了，下面主要记录图灵机相关的内容。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/assembly-language-summary.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"fsm的局限\"\u003eFSM的局限\u003c/h2\u003e\n\u003cp\u003eFSM是一个很强大的计算模型，前面章节中我们已经用电路实现了通用FSM, 那么FSM是否可以计算所有能用数字设备计算的功能或者说函数呢？\u003c/p\u003e\n\u003cp\u003e答案是不能，比如简单的括号匹配。因为FSM要靠状态来记住\u003ccode\u003e(\u003c/code\u003e和\u003ccode\u003e)\u003c/code\u003e的个数，当有一个长度无穷大的序列时，FSM便无法构造。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/fsm-limitation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e为了解决这个问题，Alan turing提出了\u003ccode\u003e图灵机\u003c/code\u003e的模型。\u003c/p\u003e\n\u003ch2 id=\"图灵机\"\u003e图灵机\u003c/h2\u003e\n\u003cp\u003e图灵机的核心还是FSM, 不过现在多了一条无限长的纸带，FSM可以通过存储在纸带上的符号来记录额外的信息，从而避免了状态数过多而无法构造FSM的问题。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/turing-machine.png\"\u003e\u003c/p\u003e\n\u003cp\u003e因为一段纸带上的符号可以被编码为一个整数，所以图灵机就是一个整数函数$y = TM_I(x)$。\u003c/p\u003e\n\u003cp\u003e其中$I$是用来标识特定功能即有特定FSM的图灵机，我们可以将FSM的真值表编码成数字来表示$I$。\u003c/p\u003e\n\u003ch2 id=\"churchs-thesis\"\u003eChurch\u0026rsquo;s Thesis\u003c/h2\u003e\n\u003cp\u003e$f(x) computable \u003c=\u003e for some k, all x f(x) = T_k[x]$\u003c/p\u003e\n\u003cp\u003e该定理由图灵的老师Church提出，但目前并没有证明，不过已经被普遍接受（可能是还没找到反例吧）。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/computability.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"通用图灵机\"\u003e通用图灵机\u003c/h2\u003e\n\u003cp\u003e对于不同的计算任务，其构造的FSM不同，所构造的图灵机便也不同，那么为了各种计算任务，就需要构造各种各样的图灵机（实际上只有FSM不同）。那么存在一种或者一个图灵机，能够计算所有图灵机能计算的函数吗？\u003c/p\u003e\n\u003cp\u003e从21世纪的结果来看，当然是存在的！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/the-universal-function.png\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示，$U(k, j) = T_k[j]$是一个Universal Function, 实现这个函数的图灵机便是通用图灵机。\u003c/p\u003e\n\u003cp\u003e实际上，这里的关键在于$k$。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/universality.png\"\u003e\u003c/p\u003e\n\u003cp\u003e$k$在这里是表示\u003ccode\u003eprogram\u003c/code\u003e，理论上讲就是对FSM的编码，比如用FSM的真值表来编码，而从上层计算机的角度来讲的话，$k$就是可执行的二进制程序，而PC本身就是一个通用图灵机！通用图灵机的计算便是对$k$的interpret，实际上就是把$k$本身的计算步骤走一遍。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/coded-algorithms.png\"\u003e\u003c/p\u003e\n\u003cp\u003e现在的各种编码算法，实际上就是把一个FSM编码成整数从而输入给通用图灵机。\u003c/p\u003e\n\u003cp\u003e不过由于内存的空间是有限的，所以实际中的计算机还是只能计算数据量不超过内存大小的任务。\u003c/p\u003e\n\u003ch2 id=\"uncomputability\"\u003eUncomputability\u003c/h2\u003e\n\u003cp\u003e如下是一个不可计算函数的例子，也就是所谓的图灵停机问题。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/uncomputability.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-10/why-fh-is-uncomputable.png\"\u003e\u003c/p\u003e","title":"Assembly Language"},{"content":"Designing an instruction set 课程地址: https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c9/c9s1/\n本章用前8章所学的知识设计了一个简单的通用计算机，采用冯诺伊曼结构，即main memory + CPU，而CPU则主要由datapath(即以ALU为主的计算电路)和control logic(即用ROM和Register实现的FSM控制电路)。整体内容很简单，但是很好玩！\nDatapaths and FSMs Let’s start by designing the logic that implements the desired computations — we call this part of the logic the “datapath”.\n上图虽然实现了a和b的计算，但还不能控制其状态，即不能在b为0时结束循环，所以需要一个FSM来控制整个计算电路即datapath的状态。\nProgrammable Datapath 第一节中设计了一个可以计算介乘的datapath, 然后配上一个简单的FSM, 就可以完成计算任务。但实际中的计算任务有成千上万种，我们不能为每种任务都设计一个单独的datapath。\n首先每种计算都可以分解为ALU的几个基本计算类型(Arithmetic, Bool, Comparable, Shift)，所以就计算来说，一个ALU就差不多够用了。但有的任务可能需要更多的寄存器来保存中间结果，所以增加寄存器数量是必须的。如下是一个简单的可以进行通用计算的datapath.\nThe von Neumann Model 在上一节的模型的基础上，冯诺伊曼引入了主存和输入/输出设备，从而执行数据量更大的计算任务，而且也可以有各种各样的输入输出设备，如下图所示。\nStorage 冯诺伊曼模型的要点是用主存来存储指令和数据，主存相对于寄存器来说，最主要的优点就是容量大，所以能存储很多条指令。假如一条指令是32位也就是4bytes的话，那么1KB就能存256条指令，1M就能存256000条！\n在冯诺伊曼结构中，有一个专门的PC寄存器，用来存储下一条指令在主存中的地址。\n指令和指令集 指令就是用来告诉control logic该干什么，指令集就是按同一标准设计的一大堆指令，可以控制control logic干各种各样的事。指令集相关内容感觉没有太多需要记录的，所以就不记录啦。\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-09/","summary":"\u003ch1 id=\"designing-an-instruction-set\"\u003eDesigning an instruction set\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c9/c9s1/\"\u003ehttps://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c9/c9s1/\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章用前8章所学的知识设计了一个简单的通用计算机，采用冯诺伊曼结构，即\u003cem\u003emain memory\u003c/em\u003e + \u003cem\u003eCPU\u003c/em\u003e，而CPU则主要由\u003cem\u003edatapath\u003c/em\u003e(即以ALU为主的计算电路)和\u003cem\u003econtrol logic\u003c/em\u003e(即用ROM和Register实现的FSM控制电路)。整体内容很简单，但是很好玩！\u003c/p\u003e\n\u003ch2 id=\"datapaths-and-fsms\"\u003eDatapaths and FSMs\u003c/h2\u003e\n\u003cp\u003eLet’s start by designing the logic that implements the desired computations — we call this part of the logic the “\u003cem\u003edatapath\u003c/em\u003e”.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/datapath-for-factorial.png\"\u003e\u003c/p\u003e\n\u003cp\u003e上图虽然实现了a和b的计算，但还不能控制其状态，即不能在b为0时结束循环，所以需要一个FSM来控制整个计算电路即datapath的状态。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/control-fsm-for-factorial.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/control-fsm-hardware.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"programmable-datapath\"\u003eProgrammable Datapath\u003c/h2\u003e\n\u003cp\u003e第一节中设计了一个可以计算介乘的datapath, 然后配上一个简单的FSM, 就可以完成计算任务。但实际中的计算任务有成千上万种，我们不能为每种任务都设计一个单独的datapath。\u003c/p\u003e\n\u003cp\u003e首先每种计算都可以分解为ALU的几个基本计算类型(Arithmetic, Bool, Comparable, Shift)，所以就计算来说，一个ALU就差不多够用了。但有的任务可能需要更多的寄存器来保存中间结果，所以增加寄存器数量是必须的。如下是一个简单的可以进行通用计算的datapath.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/a-simple-programmable-datapath.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/a-control-fsm-for-factorial.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"the-von-neumann-model\"\u003eThe von Neumann Model\u003c/h2\u003e\n\u003cp\u003e在上一节的模型的基础上，冯诺伊曼引入了主存和输入/输出设备，从而执行数据量更大的计算任务，而且也可以有各种各样的输入输出设备，如下图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/the-von-neumann-model.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"storage\"\u003eStorage\u003c/h2\u003e\n\u003cp\u003e冯诺伊曼模型的要点是用主存来存储指令和数据，主存相对于寄存器来说，最主要的优点就是容量大，所以能存储很多条指令。假如一条指令是32位也就是4bytes的话，那么1KB就能存256条指令，1M就能存256000条！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/stored-program-computer.png\"\u003e\u003c/p\u003e\n\u003cp\u003e在冯诺伊曼结构中，有一个专门的\u003cem\u003ePC\u003c/em\u003e寄存器，用来存储\u003cem\u003e下一条\u003c/em\u003e指令在主存中的地址。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/anatomy-of-von-neumann-computer.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"指令和指令集\"\u003e指令和指令集\u003c/h2\u003e\n\u003cp\u003e指令就是用来告诉\u003cem\u003econtrol logic\u003c/em\u003e该干什么，指令集就是按同一标准设计的一大堆指令，可以控制\u003cem\u003econtrol logic\u003c/em\u003e干各种各样的事。指令集相关内容感觉没有太多需要记录的，所以就不记录啦。\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-09/beta-isa-summary.png\"\u003e\u003c/p\u003e","title":"Designing an instruction set"},{"content":"Design Tradeoffs 课程地址\n本章从CMOS的电能消耗出发，讲如何减少不必要的能量损失，同时也讲了很多时间和空间的tradeoff.\nPower dissipation 电路优化的几个metrics CMOS能耗 一个减小能耗的简单例子 Carry-select Adder 设计一个N位的加法器，最直观的设计就是把N个全加器串联。\n但是这样的$t_{PD}$是$\\theta(N)$级别的。\n现在将一个32位的加法器分成两个16位的部分分别计算再组合，$t_{PD}$就差不多减小了一半。\n按这个思路一直二分下去，$t_{PD}$便能达到$O(\\log n)$。\nCarry lookahead Adder(CLA) 从$C_{out}$的计算公式中可以看出，一个FA的输入可以转换成3个变量$P$,$G$和$C_{in}$ ，其中只有$C_{in}$需要该位的前一位的$C_{out}$。\n如果知道了两个相邻位置的$P$和$G$，那么可以把这两位当作一个整体，计算出这个整体的$P$和$G$，这时$P$和$G$任然还保留着原来的性质，所以，我们可以用倍增来计算整个电路的$P$和$G$。\n下图是一个8-bits的CLA的G\u0026amp;P generate的部分：\n然后是计算Carry的方法：\n完整版：\nMultiplier binary multiplication 就是普通的竖式乘法，但是要注意如果值是补码，那最高位的全值为$-2^{N-1}$而不是$2^{N-1}$。\n如下是值为补码的情况：\npipelined multiplier 虽然pipeline化了，但每个stage的$t_{PD}$还是$O(N)$的，主要问题在于要按行传递carry。\nCarry-save multiplier 讲每行需要传递的carry降到下一行（反正都是加在同一列，所以对结果没影响），这样可以将每个stage的$t_{PD}$优化到$O(1)$，但是需要更多的行，也就是面积增加了。\n用时序电路减少面积 求和-\u0026gt;移位-\u0026gt;求和。\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-08/","summary":"\u003ch1 id=\"design-tradeoffs\"\u003eDesign Tradeoffs\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c8/c8s1/\"\u003e课程地址\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e本章从CMOS的电能消耗出发，讲如何减少不必要的能量损失，同时也讲了很多时间和空间的tradeoff.\u003c/p\u003e\n\u003ch2 id=\"power-dissipation\"\u003ePower dissipation\u003c/h2\u003e\n\u003ch3 id=\"电路优化的几个metrics\"\u003e电路优化的几个metrics\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/optimizing-your-design.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"cmos能耗\"\u003eCMOS能耗\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/cmos-static-power-dissipation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/cmos-dynamic-power-dissipation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/cmos-dynamic-power-dissipation-2.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"一个减小能耗的简单例子\"\u003e一个减小能耗的简单例子\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/how-can-we-reduce-power.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/fewer-transitions.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"carry-select-adder\"\u003eCarry-select Adder\u003c/h2\u003e\n\u003cp\u003e设计一个N位的加法器，最直观的设计就是把N个全加器串联。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/adder-example.png\"\u003e\u003c/p\u003e\n\u003cp\u003e但是这样的$t_{PD}$是$\\theta(N)$级别的。\u003c/p\u003e\n\u003cp\u003e现在将一个32位的加法器分成两个16位的部分分别计算再组合，$t_{PD}$就差不多减小了一半。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/carry-select-adder.png\"\u003e\u003c/p\u003e\n\u003cp\u003e按这个思路一直二分下去，$t_{PD}$便能达到$O(\\log n)$。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/32-bits-carry-select-adder.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"carry-lookahead-addercla\"\u003eCarry lookahead Adder(CLA)\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/faster-carry-logic.png\"\u003e\u003c/p\u003e\n\u003cp\u003e从$C_{out}$的计算公式中可以看出，一个FA的输入可以转换成3个变量$P$,$G$和$C_{in}$ ，其中只有$C_{in}$需要该位的前一位的$C_{out}$。\u003c/p\u003e\n\u003cp\u003e如果知道了两个相邻位置的$P$和$G$，那么可以把这两位当作一个整体，计算出这个整体的$P$和$G$，这时$P$和$G$任然还保留着原来的性质，所以，我们可以用倍增来计算整个电路的$P$和$G$。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/carry-lookahead-adder.png\"\u003e\u003c/p\u003e\n\u003cp\u003e下图是一个8-bits的CLA的G\u0026amp;P generate的部分：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/8-bit-cla-generate-G\u0026P.png\"\u003e\u003c/p\u003e\n\u003cp\u003e然后是计算Carry的方法：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/8-bit-cla-carry-generation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e完整版：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/8-bit-cla-complete.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"multiplier\"\u003eMultiplier\u003c/h2\u003e\n\u003ch3 id=\"binary-multiplication\"\u003ebinary multiplication\u003c/h3\u003e\n\u003cp\u003e就是普通的竖式乘法，但是要注意如果值是补码，那最高位的全值为$-2^{N-1}$而不是$2^{N-1}$。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/binary-multiplication.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/combinational-multiplier.png\"\u003e\u003c/p\u003e\n\u003cp\u003e如下是值为补码的情况：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/complement-multiplication.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/complement-multiplier.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"pipelined-multiplier\"\u003epipelined multiplier\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/pipelined-multiplier.png\"\u003e\u003c/p\u003e\n\u003cp\u003e虽然pipeline化了，但每个stage的$t_{PD}$还是$O(N)$的，主要问题在于要按行传递carry。\u003c/p\u003e\n\u003ch3 id=\"carry-save-multiplier\"\u003eCarry-save multiplier\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/carry-save-multiplier.png\"\u003e\u003c/p\u003e\n\u003cp\u003e讲每行需要传递的carry降到下一行（反正都是加在同一列，所以对结果没影响），这样可以将每个stage的$t_{PD}$优化到$O(1)$，但是需要更多的行，也就是面积增加了。\u003c/p\u003e\n\u003ch3 id=\"用时序电路减少面积\"\u003e用时序电路减少面积\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/sequential-logic-multiplier.png\"\u003e\u003c/p\u003e\n\u003cp\u003e求和-\u0026gt;移位-\u0026gt;求和。\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-08/design-tradeoff-summary.png\"\u003e\u003c/p\u003e","title":"Design Tradeoffs"},{"content":"Performance Measures 本章主要是讲pipeline的原理以及如何将一般的逻辑电路转换为pipeline，最后简单提到了一下异步电路和同步电路的区别。\nLatency and Throughput Latency: the delay from when an input is established until the output associated with that input becomes valid.\nThroughput: The rate at which inputs or outputs are processed.\nPipelined Circuites 如上图所示，在计算$P(X)$时，F和G一直处于空闲状态，那么有没有办法把这段时间利用起来呢？\n我们可以用寄存器来保持F和G的输出，从而在$P(X)$的工作时间内，可以让F和G去进行其他计算。\nPipelining Methodology 如上是将一般逻辑电路pipeline化的一般步骤\nCircuit Interleaving Pipeline的瓶颈在于$t_{PD}$最大的那个module, 我们可以用如下的方式将两个相同的module组合在一起，提高throughput.\n异步及同步 同一个module对于不同的输入，所需要的时间可能也不一样。按之前的CLK驱动来设计电路的话，计算CLK的时候需要用module的最长计算时间，才能保证正确性。但对于一些计算较快的输入，这样做肯定是浪费了时间的。\n上图展示了用同步和异步两种方式来实现一个简单的握手协议，对于异步电路来说，不再需要全局的CLK，所以效率非常高，但实际设计非常困难；对于同步电路来说，不再需要靠CLK来在module之间传输数据，效率也提高了，虽然还是在CLK上升沿才会有数据输入输出，但CLK不需要用最长计算时间的输入来计算了。\n这个简单的握手协议如下：\nIn phase 1, when the upstream stage has a new output and GOT-X is deasserted, it asserts its HERE-IS-X signal and then waits to see the downstream stage’s reply on the GOT-X signal. In phase 2, the downstream stage, seeing that HERE-IS-X is asserted, asserts GOT-X when it has consumed the available input. In phase 3, the downstream stage waits to see the HERE-IS-X go low, indicating that the upstream stage has successfully received the GOT-X signal. In phase 4, once HERE-IS-X is deasserted, the downstream stage deasserts GOT-X and the transfer handshake is ready to begin again. Note that the upstream stage waits until it sees the GOT-X deasserted before starting the next handshake. Control Structure 想不到图中 Globally timed + asynchronous 的实例QAQ\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-07/","summary":"\u003ch1 id=\"performance-measures\"\u003ePerformance Measures\u003c/h1\u003e\n\u003cp\u003e本章主要是讲\u003cem\u003epipeline\u003c/em\u003e的原理以及如何将一般的逻辑电路转换为\u003cem\u003epipeline\u003c/em\u003e，最后简单提到了一下异步电路和同步电路的区别。\u003c/p\u003e\n\u003ch2 id=\"latency-and-throughput\"\u003eLatency and Throughput\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003eLatency\u003c/em\u003e: the delay from when an input is established until the output associated with that input becomes valid.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eThroughput\u003c/em\u003e: The rate at which inputs or outputs are processed.\u003c/p\u003e\n\u003ch2 id=\"pipelined-circuites\"\u003ePipelined Circuites\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/back-to-circuits.png\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示，在计算$P(X)$时，F和G一直处于空闲状态，那么有没有办法把这段时间利用起来呢？\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/pipelined-circuits.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们可以用寄存器来保持F和G的输出，从而在$P(X)$的工作时间内，可以让F和G去进行其他计算。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/pipelined-diagrams.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/pipeline-conventions.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"pipelining-methodology\"\u003ePipelining Methodology\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/a-pipelining-methodology.png\"\u003e\u003c/p\u003e\n\u003cp\u003e如上是将一般逻辑电路pipeline化的一般步骤\u003c/p\u003e\n\u003ch2 id=\"circuit-interleaving\"\u003eCircuit Interleaving\u003c/h2\u003e\n\u003cp\u003ePipeline的瓶颈在于$t_{PD}$最大的那个module, 我们可以用如下的方式将两个相同的module组合在一起，提高throughput.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/circuit-interleaving.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/circuit-interleaving-timing.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/circuit-interleaving-timing-2.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/combine-techniques.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"异步及同步\"\u003e异步及同步\u003c/h2\u003e\n\u003cp\u003e同一个module对于不同的输入，所需要的时间可能也不一样。按之前的CLK驱动来设计电路的话，计算CLK的时候需要用module的最长计算时间，才能保证正确性。但对于一些计算较快的输入，这样做肯定是浪费了时间的。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/control-structure-alternatives.png\"\u003e\u003c/p\u003e\n\u003cp\u003e上图展示了用同步和异步两种方式来实现一个简单的握手协议，对于异步电路来说，不再需要全局的CLK，所以效率非常高，但实际设计非常困难；对于同步电路来说，不再需要靠CLK来在module之间传输数据，效率也提高了，虽然还是在CLK上升沿才会有数据输入输出，但CLK不需要用最长计算时间的输入来计算了。\u003c/p\u003e\n\u003cp\u003e这个简单的握手协议如下：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIn phase 1, when the upstream stage has a new output and GOT-X is deasserted, it asserts its HERE-IS-X signal and then waits to see the downstream stage’s reply on the GOT-X signal.\u003c/li\u003e\n\u003cli\u003eIn phase 2, the downstream stage, seeing that HERE-IS-X is asserted, asserts GOT-X when it has consumed the available input.\u003c/li\u003e\n\u003cli\u003eIn phase 3, the downstream stage waits to see the HERE-IS-X go low, indicating that the upstream stage has successfully received the GOT-X signal.\u003c/li\u003e\n\u003cli\u003eIn phase 4, once HERE-IS-X is deasserted, the downstream stage deasserts GOT-X and the transfer handshake is ready to begin again. Note that the upstream stage waits until it sees the GOT-X deasserted before starting the next handshake.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-07/selfed-time-example.png\"\u003e\u003c/p\u003e","title":"Performance Measures"},{"content":"Finite State Machine 有穷自动机本身是一个比较简单的概念，不过这里的主要难点是考虑将异步信号转换为同步\n课程地址: Finate State Machine\n本课程中自动机的表示图 异步时钟 当电路中的时钟信号和输入变量的时钟信号不一样时，需要将输入的时钟信号转换为与电路时钟同步的信号，从而使得电路能正常工作。\nThe bounded-time Synchronizer 当IN和CLK的上升沿到来时间$t_{IN}$和$t_{CLK}$相差大于$t_{E}$时，Synchronizer将输出至少持续$t_{D}$时长的0或1。但如果IN和CLK的上升时间沿到来时间之差小于$t_E$时，就无法确定Synchronizer的输出。为什么无法确定？个人理解是因为上升沿实际是要一段时间才能完成的，如果两者上升沿到来时间相差太短，当CLK达到1时，IN可能还在中间。\n那么该如何用逻辑电路来实现这个Synchronizer，当然要靠D-Register啦！\n上图是用D-Register实现的Synchronizer, 用$t_{setup}$和$t_{hold}$来充当$t_{E}$，看起来很美好，但还没有解决IN和CLK的上升沿同时到来的问题！\n当IN和CLK的上升沿同时到来时，可能会让D-latch进入metastable状态：\n解决办法：加D-Register!\n","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-06/","summary":"\u003ch1 id=\"finite-state-machine\"\u003eFinite State Machine\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e有穷自动机本身是一个比较简单的概念，不过这里的主要难点是考虑将异步信号转换为同步\u003c/p\u003e\n\u003cp\u003e课程地址: \u003ca href=\"https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c6/c6s1/\"\u003eFinate State Machine\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"本课程中自动机的表示图\"\u003e本课程中自动机的表示图\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/valid-state-fsm.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"异步时钟\"\u003e异步时钟\u003c/h2\u003e\n\u003cp\u003e当电路中的时钟信号和输入变量的时钟信号不一样时，需要将输入的时钟信号转换为与电路时钟同步的信号，从而使得电路能正常工作。\u003c/p\u003e\n\u003ch3 id=\"the-bounded-time-synchronizer\"\u003eThe bounded-time Synchronizer\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/the-bounded-time-synchronizer.png\"\u003e\u003c/p\u003e\n\u003cp\u003e当\u003ccode\u003eIN\u003c/code\u003e和\u003ccode\u003eCLK\u003c/code\u003e的上升沿到来时间$t_{IN}$和$t_{CLK}$相差大于$t_{E}$时，Synchronizer将输出至少持续$t_{D}$时长的0或1。但如果\u003ccode\u003eIN\u003c/code\u003e和\u003ccode\u003eCLK\u003c/code\u003e的上升时间沿到来时间之差小于$t_E$时，就无法确定Synchronizer的输出。为什么无法确定？个人理解是因为上升沿实际是要一段时间才能完成的，如果两者上升沿到来时间相差太短，当\u003ccode\u003eCLK\u003c/code\u003e达到1时，\u003ccode\u003eIN\u003c/code\u003e可能还在中间。\u003c/p\u003e\n\u003cp\u003e那么该如何用逻辑电路来实现这个Synchronizer，当然要靠\u003cem\u003eD-Register\u003c/em\u003e啦！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/d-register-synchronizer.png\"\u003e\u003c/p\u003e\n\u003cp\u003e上图是用\u003cem\u003eD-Register\u003c/em\u003e实现的Synchronizer, 用$t_{setup}$和$t_{hold}$来充当$t_{E}$，看起来很美好，但还没有解决\u003ccode\u003eIN\u003c/code\u003e和\u003ccode\u003eCLK\u003c/code\u003e的上升沿同时到来的问题！\u003c/p\u003e\n\u003cp\u003e当\u003ccode\u003eIN\u003c/code\u003e和\u003ccode\u003eCLK\u003c/code\u003e的上升沿同时到来时，可能会让D-latch进入metastable状态：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/synchronizer-metastable-state.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/metastable-properties.png\"\u003e\u003c/p\u003e\n\u003cp\u003e解决办法：加D-Register!\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-06/declay-increases-reliability.png\"\u003e\u003c/p\u003e","title":"Finite State Machine"},{"content":"Sequential Logic 课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c5/c5s1/\nBackground 用简单的逻辑门与/或/非可以实现很多逻辑函数，但有一种很简单的电路，却没办法用与/或/非直接实现，如下图所示的开关电路。\n普通的组合逻辑电路和开关电路最大的区别在于开关电路的输出还于当前的输出(状态)有关。\n为了用逻辑电路来实现相同的功能，首先得让电路能记住上一次的状态。\nMemory Using Capacitors 如上图所示，电容是可以存储 ”电压“ 的装置，所以很容易想到用电容来实现存储电路。不过在现实环境中，电容没办法做到完全不漏电，所以用电容实现的存储电路每隔一段时间要充一次电。\nDRAM便是类似的原理，需要定时刷新电容上的电压，特点是体积小，便宜。\nUsing Feedback 另一个实现存储电路的思路便是正反馈，如下图所示。\n上图中用两个invertor实现的正反馈电路可以使输出稳定保持，但除了高低两个状态，还有一个中间的状态，而且该电路也可能会永远保持在中间的状态，所以我们需要避免这种情况。\nSettable Memory 我们可以用一个两位的MUX来实现一个可设定的Memory.\n这样的元件叫做D-latch, 即D锁存器。\n要理解D-latch输入输出和时间的关系，如下图。\nTry it out 虽然D-锁存器能够存储状态，但当有一连串的状态输入时，如果要保证每次只有一个状态能通过，然后被其余逻辑电路读取，然后下一个状态才能通过的话，需要对时间做非常严格的限制，但在实际环境中，各种干扰和噪声让这种限制变得几乎不太可能。\nMove to Register Flaky Control System 为了解决上面Try it out中提到的问题，这里先用一个现实中的例子来解释一下：\nD-Register 我们可以按如上的例子用D-latch来实现一个这样的系统。\n各种时序图 理解D-Register的时序很重要！！！\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-05/","summary":"\u003ch1 id=\"sequential-logic\"\u003eSequential Logic\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e课程地址：https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-004-computation-structures-spring-2017/c5/c5s1/\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"background\"\u003eBackground\u003c/h2\u003e\n\u003cp\u003e用简单的逻辑门与/或/非可以实现很多逻辑函数，但有一种很简单的电路，却没办法用与/或/非直接实现，如下图所示的开关电路。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/simple-switch.png\"\u003e\u003c/p\u003e\n\u003cp\u003e普通的组合逻辑电路和开关电路最大的区别在于开关电路的输出还于当前的输出(状态)有关。\u003c/p\u003e\n\u003cp\u003e为了用逻辑电路来实现相同的功能，首先得让电路能\u003cem\u003e记住\u003c/em\u003e上一次的状态。\u003c/p\u003e\n\u003ch2 id=\"memory\"\u003eMemory\u003c/h2\u003e\n\u003ch3 id=\"using-capacitors\"\u003eUsing Capacitors\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/memory-capacitor.png\"\u003e\u003c/p\u003e\n\u003cp\u003e如上图所示，电容是可以存储 ”电压“ 的装置，所以很容易想到用电容来实现存储电路。不过在现实环境中，电容没办法做到完全不漏电，所以用电容实现的存储电路每隔一段时间要充一次电。\u003c/p\u003e\n\u003cp\u003eDRAM便是类似的原理，需要定时刷新电容上的电压，特点是体积小，便宜。\u003c/p\u003e\n\u003ch3 id=\"using-feedback\"\u003eUsing Feedback\u003c/h3\u003e\n\u003cp\u003e另一个实现存储电路的思路便是正反馈，如下图所示。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/memory-feedback.png\"\u003e\u003c/p\u003e\n\u003cp\u003e上图中用两个\u003cem\u003einvertor\u003c/em\u003e实现的正反馈电路可以使输出稳定保持，但除了高低两个状态，还有一个中间的状态，而且该电路也可能会永远保持在中间的状态，所以我们需要避免这种情况。\u003c/p\u003e\n\u003ch3 id=\"settable-memory\"\u003eSettable Memory\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/settable-memory-element.png\"\u003e\u003c/p\u003e\n\u003cp\u003e我们可以用一个两位的MUX来实现一个可设定的Memory.\u003c/p\u003e\n\u003cp\u003e这样的元件叫做D-latch, 即D锁存器。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/d-latch.png\"\u003e\u003c/p\u003e\n\u003cp\u003e要理解D-latch输入输出和时间的关系，如下图。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/plea-for-lenience.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/little-displine-for-d-latch.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"try-it-out\"\u003eTry it out\u003c/h3\u003e\n\u003cp\u003e虽然D-锁存器能够存储状态，但当有一连串的状态输入时，如果要保证每次只有一个状态能通过，然后被其余逻辑电路读取，然后下一个状态才能通过的话，需要对时间做非常严格的限制，但在实际环境中，各种干扰和噪声让这种限制变得几乎不太可能。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/try-it-out.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"move-to-register\"\u003eMove to Register\u003c/h2\u003e\n\u003ch3 id=\"flaky-control-system\"\u003eFlaky Control System\u003c/h3\u003e\n\u003cp\u003e为了解决上面\u003cem\u003eTry it out\u003c/em\u003e中提到的问题，这里先用一个现实中的例子来解释一下：\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/flaky-control-system-1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/flaky-control-system-2.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"d-register\"\u003eD-Register\u003c/h3\u003e\n\u003cp\u003e我们可以按如上的例子用D-latch来实现一个这样的系统。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/d-register.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"各种时序图\"\u003e各种时序图\u003c/h3\u003e\n\u003cp\u003e理解D-Register的时序很重要！！！\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/D-Register-waveforms.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/D-Register-hold-time.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/D-Register-timeing-1.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-05/sequential-logic-summary.png\"\u003e\u003c/p\u003e","title":"Sequential Logic"},{"content":"Combinational Logic 如何描述电子元件的功能 真值表 逻辑表达式 在输入变量比较多的时候，真值表就很难读/写了，所以逻辑表达式更加通用。\n设计数字电路的步骤 写出真值表 写出逻辑表达式 用AND/OR/NOT三种基本逻辑门实现，或者用NAND/NOR/NOT三种逻辑门实现 因为CMOS本身就是Inverting的，所以实际中NAND/NOR更加通用。\nSum of products 将真值表中为1的项用OR连接起来就得到了相应的逻辑表达式。\n在功能不变的情况下，为了减少逻辑门的数量，也就是减小$t_{pd}$和$t_{cd}$，就需要将逻辑表达式中的项数最小化。\n卡诺图 卡诺图化简步骤 找出Implicants\n合并\n处理lenient\nMux Decoder ROM Summary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-04/","summary":"\u003ch1 id=\"combinational-logic\"\u003eCombinational Logic\u003c/h1\u003e\n\u003ch2 id=\"如何描述电子元件的功能\"\u003e如何描述电子元件的功能\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e真值表\u003c/li\u003e\n\u003cli\u003e逻辑表达式\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e在输入变量比较多的时候，真值表就很难读/写了，所以逻辑表达式更加通用。\u003c/p\u003e\n\u003ch2 id=\"设计数字电路的步骤\"\u003e设计数字电路的步骤\u003c/h2\u003e\n\u003col\u003e\n\u003cli\u003e写出真值表\u003c/li\u003e\n\u003cli\u003e写出逻辑表达式\u003c/li\u003e\n\u003cli\u003e用AND/OR/NOT三种基本逻辑门实现，或者用NAND/NOR/NOT三种逻辑门实现\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e因为CMOS本身就是Inverting的，所以实际中NAND/NOR更加通用。\u003c/p\u003e\n\u003ch2 id=\"sum-of-products\"\u003eSum of products\u003c/h2\u003e\n\u003cp\u003e将真值表中为1的项用\u003cem\u003eOR\u003c/em\u003e连接起来就得到了相应的逻辑表达式。\u003c/p\u003e\n\u003cp\u003e在功能不变的情况下，为了减少逻辑门的数量，也就是减小$t_{pd}$和$t_{cd}$，就需要将逻辑表达式中的项数最小化。\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/sum-of-products-implementation.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/boolean-identities.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/boolean-minimization.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"卡诺图\"\u003e卡诺图\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"Karnaugh-map\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/karnaugh-map.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"卡诺图化简步骤\"\u003e卡诺图化简步骤\u003c/h4\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e找出Implicants\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/finding-implicants.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/finding-prime-implicants.png\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e合并\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/writing-down-equation.png\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e处理lenient\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/lenient.png\"\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"mux\"\u003eMux\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/mux.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"decoder\"\u003eDecoder\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/decoder.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"rom\"\u003eROM\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/ROM1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/ROM2.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-04/summary.png\"\u003e\u003c/p\u003e","title":"Combinational Logic"},{"content":"CMOS MOSFET Overview Characters Two Flavors CMOS CMOS is Complementary Metal Oxide Semiconductor\nTwo switches Inverter Basic usage of CMOS Timing specifications Propagation Delay Contamination Delay Summary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-03/","summary":"\u003ch1 id=\"cmos\"\u003eCMOS\u003c/h1\u003e\n\u003ch2 id=\"mosfet\"\u003eMOSFET\u003c/h2\u003e\n\u003ch3 id=\"overview\"\u003eOverview\u003c/h3\u003e\n\u003cp\u003e\u003cimg alt=\"N-channel MOSFET\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/nchannel-mosfet.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"characters\"\u003eCharacters\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/nchannel-mosfet-characters.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"two-flavors\"\u003eTwo Flavors\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/nchannel-two-flavors.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"cmos-1\"\u003eCMOS\u003c/h2\u003e\n\u003cp\u003eCMOS is \u003cem\u003eComplementary Metal Oxide Semiconductor\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"two-switches\"\u003eTwo switches\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/cmos-two-switches.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"inverter\"\u003eInverter\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/cmos-inverter-vtc.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"basic-usage-of-cmos\"\u003eBasic usage of CMOS\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/basic-usage-of-cmos.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"timing-specifications\"\u003eTiming specifications\u003c/h3\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/cmos-timing-specifications.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"propagation-delay\"\u003ePropagation Delay\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/cmos-propagation-delay.png\"\u003e\u003c/p\u003e\n\u003ch4 id=\"contamination-delay\"\u003eContamination Delay\u003c/h4\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/contamination-delay.png\"\u003e\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-03/cmos-summary.png\"\u003e\u003c/p\u003e","title":"CMOS"},{"content":"上官体 上官仪 背景 上官仪是初唐文学的重要人物，开创了上官体，特点是绮错婉媚，上承虞世南，下启沈佺期和宋之问。不过后来被杨炯批评为有风韵，但无风骨。\n代表作 咏画障\n芳晨丽日桃花浦，珠帘翠帐凤凰楼。\n蔡女菱歌移锦缆，燕姬春望上琼钩。\n新妆漏影浮轻扇，冶袖飘香入浅流。\n未减行雨荆台下，自比凌波洛浦游。\n新装漏影浮新扇，冶袖飘香入浅流。\n未减行云荆台下，自比凌波洛浦游。\n","permalink":"https://rmtt.github.io/zh/posts/tangsong01/","summary":"\u003ch1 id=\"上官体\"\u003e上官体\u003c/h1\u003e\n\u003ch2 id=\"上官仪\"\u003e上官仪\u003c/h2\u003e\n\u003ch3 id=\"背景\"\u003e背景\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e上官仪\u003c/em\u003e是初唐文学的重要人物，开创了上官体，特点是\u003cem\u003e绮错婉媚\u003c/em\u003e，上承\u003cem\u003e虞世南\u003c/em\u003e，下启\u003cem\u003e沈佺期\u003c/em\u003e和\u003cem\u003e宋之问\u003c/em\u003e。不过后来被\u003cem\u003e杨炯\u003c/em\u003e批评为有风韵，但无风骨。\u003c/p\u003e\n\u003ch3 id=\"代表作\"\u003e代表作\u003c/h3\u003e\n\u003cp\u003e\u003cem\u003e咏画障\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e芳晨丽日桃花浦，珠帘翠帐凤凰楼。\u003c/p\u003e\n\u003cp\u003e蔡女菱歌移锦缆，燕姬春望上琼钩。\u003c/p\u003e\n\u003cp\u003e新妆漏影浮轻扇，冶袖飘香入浅流。\u003c/p\u003e\n\u003cp\u003e未减行雨荆台下，自比凌波洛浦游。\u003c/p\u003e\n\u003cp\u003e新装漏影浮新扇，冶袖飘香入浅流。\u003c/p\u003e\n\u003cp\u003e未减行云荆台下，自比凌波洛浦游。\u003c/p\u003e","title":"唐宋诗词1-上官体"},{"content":"The Digital Abstraction 信息编码 信息的种类有各种各样，我们需要找到一种方式来表示这些信息。比如，生物的基因信息是通过DNA来记录和表达，在计算机中，所有的数据都是二进制，我们也需要一个物理介质来表达和存储这些二进制信息。\n电压 目前用来存储和表达二进制信息的物理介质绝大部分都是使用电压，高电平表示1, 低电平表示0。\nVTC和容错 VTC(voltage transfer characteristics)是用来表示一个电子原件的输入和输出电压关系的图，如下是一个Buffer的VTC：\n其中$V_{IL},V_{IH},V_{OL},V_{OH}$是一个电子元件最重要的参数，解释如下（这里假设最高电压为1）：\n$V_{IL}$是低电平的输入有效范围，即如果输入电压为$[0,V_{IL}]$，就会被元件当成0处理。 $V_{IH}$是高电平的输入有效范围，即如果输入电压为$[V_{IH}, 1]$，就会被元件当成1处理。 $V_{OL}$是低电平的输出电压，即如果元件想输出0，则其输出电压应该为$[0, V_{OL}]$。 $V_{OH}$是高电平的输出电压，即如果元件想输出1，则其输出电压应该为$[V_{OH},1]$。 其中, $min(|V_{OL} - V_{IL}|, |V_{OH} - V_{IH}|)$即为该元件能容忍的噪声范围。\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-02/","summary":"\u003ch1 id=\"the-digital-abstraction\"\u003eThe Digital Abstraction\u003c/h1\u003e\n\u003ch2 id=\"信息编码\"\u003e信息编码\u003c/h2\u003e\n\u003cp\u003e信息的种类有各种各样，我们需要找到一种方式来表示这些信息。比如，生物的基因信息是通过DNA来记录和表达，在计算机中，所有的数据都是二进制，我们也需要一个物理介质来表达和存储这些二进制信息。\u003c/p\u003e\n\u003ch2 id=\"电压\"\u003e电压\u003c/h2\u003e\n\u003cp\u003e目前用来存储和表达二进制信息的物理介质绝大部分都是使用电压，高电平表示1, 低电平表示0。\u003c/p\u003e\n\u003ch2 id=\"vtc和容错\"\u003eVTC和容错\u003c/h2\u003e\n\u003cp\u003eVTC(voltage transfer characteristics)是用来表示一个电子原件的输入和输出电压关系的图，如下是一个\u003cem\u003eBuffer\u003c/em\u003e的VTC：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"img\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-02/Slide17.png\"\u003e\u003c/p\u003e\n\u003cp\u003e其中$V_{IL},V_{IH},V_{OL},V_{OH}$是一个电子元件最重要的参数，解释如下（这里假设最高电压为1）：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e$V_{IL}$是低电平的输入有效范围，即如果输入电压为$[0,V_{IL}]$，就会被元件当成0处理。\u003c/li\u003e\n\u003cli\u003e$V_{IH}$是高电平的输入有效范围，即如果输入电压为$[V_{IH}, 1]$，就会被元件当成1处理。\u003c/li\u003e\n\u003cli\u003e$V_{OL}$是低电平的输出电压，即如果元件想输出0，则其输出电压应该为$[0, V_{OL}]$。\u003c/li\u003e\n\u003cli\u003e$V_{OH}$是高电平的输出电压，即如果元件想输出1，则其输出电压应该为$[V_{OH},1]$。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e其中, $min(|V_{OL} - V_{IL}|, |V_{OH} - V_{IH}|)$即为该元件能容忍的噪声范围。\u003c/p\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"img\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/computation-structure-02/Slide20.png\"\u003e\u003c/p\u003e","title":"The Digital Abstraction"},{"content":"Basic of Information 信息是什么 信息是我们接收到的关于确实某个特定事件或者情况的数据。\n量化信息 对于随机变量$X_i$，其发生的概率为$p_i$，则其传达的信息量为:\n$$I(x_i) = \\log_2(\\frac{1}{p_i})$$数据中的信息 假设收到data的概率$p_{data}$，则\n$$I(data) = \\log_2(\\frac{1}{p_{data}})$$Entropy 信息论中的entropy：\n$$H(X) = \\sum_{i=1}^{N}p_i\\log_2(\\frac{1}{p_i})$$其中$X$为随机变量。\n物理中的entropy：\n$$ S = k\\ln\\Omega $$其中，$k$为玻尔兹曼常数\nMeaning of Entropy 为了描述某一个随机变量$X$，需要传输一系列的数据，Entropy就是确定$X_i$发生与否的平均位数，即传输量。\n编码 编码就是把一个数据集合映射为一系列二进制字符串。常见的编码是把英文字母用二进制来表示，比如如下表格：\nA B C D ABBC的编码 00 01 10 11 00 01 01 00 01 1 000 001 01 1 1 01 0 1 10 11 0 1 1 0（无法确定） 编码不能有二义性\n二叉树编码 用二叉树的边当作0和1,叶子节点当作编码的值，可以去除二义性。\n定长编码 所有值的编码长度都相等。\n2的补码 即将二进制最高位的全值定为$-2^{N-1}$\n负数的补码，按位取反再加1,因为$-A = -1 - A + 1$\n变长编码 哈夫曼编码 错误检测 Hamming distance Hamming distance H等于两个二进制编码中，不同的位数。\n假设数据传输中，合法的数据集合为$S$，且$S$中元素的Hamming distance为E, 则该编码系统能检测$\\lfloor{\\frac{E}{2}}\\rfloor$Bits的错误，能纠正$\\lfloor\\frac{E - 1}{2}\\rfloor$Bits的错误。\nSummary ","permalink":"https://rmtt.github.io/zh/posts/computation-structure/computation-structure-01/","summary":"\u003ch1 id=\"basic-of-information\"\u003eBasic of Information\u003c/h1\u003e\n\u003ch2 id=\"信息是什么\"\u003e信息是什么\u003c/h2\u003e\n\u003cp\u003e信息是我们接收到的关于确实某个特定事件或者情况的数据。\u003c/p\u003e\n\u003ch2 id=\"量化信息\"\u003e量化信息\u003c/h2\u003e\n\u003cp\u003e对于随机变量$X_i$，其发生的概率为$p_i$，则其传达的信息量为:\u003c/p\u003e\n$$I(x_i) = \\log_2(\\frac{1}{p_i})$$\u003ch2 id=\"数据中的信息\"\u003e数据中的信息\u003c/h2\u003e\n\u003cp\u003e假设收到data的概率$p_{data}$，则\u003c/p\u003e\n$$I(data) = \\log_2(\\frac{1}{p_{data}})$$\u003ch2 id=\"entropy\"\u003eEntropy\u003c/h2\u003e\n\u003cp\u003e信息论中的entropy：\u003c/p\u003e\n$$H(X) = \\sum_{i=1}^{N}p_i\\log_2(\\frac{1}{p_i})$$\u003cp\u003e其中$X$为随机变量。\u003c/p\u003e\n\u003cp\u003e物理中的entropy：\u003c/p\u003e\n$$ S = k\\ln\\Omega $$\u003cp\u003e其中，$k$为玻尔兹曼常数\u003c/p\u003e\n\u003ch2 id=\"meaning-of-entropy\"\u003eMeaning of Entropy\u003c/h2\u003e\n\u003cp\u003e为了描述某一个随机变量$X$，需要传输一系列的数据，Entropy就是确定$X_i$发生与否的平均位数，即传输量。\u003c/p\u003e\n\u003ch2 id=\"编码\"\u003e编码\u003c/h2\u003e\n\u003cp\u003e编码就是把一个数据集合映射为一系列二进制字符串。常见的编码是把英文字母用二进制来表示，比如如下表格：\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth style=\"text-align: center\"\u003eA\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eB\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eC\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eD\u003c/th\u003e\n          \u003cth style=\"text-align: center\"\u003eABBC的编码\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003e00\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e01\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e10\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e11\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e00 01 01 00\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003e01\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e1\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e000\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e001\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e01 1 1 01\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd style=\"text-align: center\"\u003e0\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e1\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e10\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e11\u003c/td\u003e\n          \u003ctd style=\"text-align: center\"\u003e0 1 1 0（无法确定）\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cblockquote\u003e\n\u003cp\u003e编码不能有二义性\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch3 id=\"二叉树编码\"\u003e二叉树编码\u003c/h3\u003e\n\u003cp\u003e用二叉树的边当作0和1,叶子节点当作编码的值，可以去除二义性。\u003c/p\u003e\n\u003ch3 id=\"定长编码\"\u003e定长编码\u003c/h3\u003e\n\u003cp\u003e所有值的编码长度都相等。\u003c/p\u003e\n\u003ch3 id=\"2的补码\"\u003e2的补码\u003c/h3\u003e\n\u003cp\u003e即将二进制最高位的全值定为$-2^{N-1}$\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e负数的补码，按位取反再加1,因为$-A = -1 - A + 1$\u003c/p\u003e","title":"Basic of information"},{"content":"Introduction to basic conception The Continuum of Numbers 首先，自然数可以认为是与生俱来的，但是普通的四则运算所产生的结果却不一定是自然运算，比如$1 - 1 = 0$ , $1 - 2 = -1$ , $1\\div2 =\\frac{1}{2}$都产生了结果不是自然数的情况。为了满足四则运算能更方便的使用，便引入了$0$ 、分数和负数，即有理数。\n有理数的引入使得四则运算的适用范围更广，但有理数是否就能表示生活中所有能见到的物体的度量呢？答案是否定的，比如两个直角边都为1的直角三角形，根据毕达哥拉斯定理，其斜边的平方为$c^2 = 1^2 + 1^2$，但我们无法找到一个有理数，使得其平方为$2$，所以，有理数并不能满足所有的计算。\nReal Number and Nested Interval 现在我们用数轴上的点来当作Continuum of Numbers的基本元素，其中每个点都对应一个实数x, 实数之间的大小关系就是其在数轴上的位置关系，比如x在y左边则$x \u003c y$.\n我们已经知道有理数可以用两个整数p和q的商$\\frac{p}{q}$来定义，那该如何用已知的有理数或者自然数来定义无理数呢？数学中常用的一种做法是渐进，即找一个无限接近目标的序列，其项数越多，误差就越小。为了取得无理数x的渐进值，我们需要从两边同时靠近它(只考虑一边的话便没有终止条件)，即在其他左右两边各取一个有理数，比如$a_1$和$b_1$, 且$a_1 \u003c x$,$b_1 \u003e x$, 这样，就选取了一个包含x的区间$[a_1, b_1]$。然后，将$[a_1, b_1]$对半分，取其中包含x的区间$[a_2, b_2]$，则$a_1 \\le a_2 \u003c x$, $x \u003c b_2 \\le b_1$。同样的，我们可以继续二分$[a_2, b_2]$，并不断重复下去，则可以得到任意个包含x的区间，且$[a_n, b_n]$包含于$[a_{n+1}, b_{n+1}]$，我们称这样一个区间序列为嵌套区间 。很显然，每个区间与x的误差不超过$|b_n - a_n|$。\n小数 在前面的嵌套区间中，$a_n \u003c x \u003c b_n$。现在将数轴按以1为单位标记，然后将每个单位长度区间10等分。假设$0 \\le x \\le 1$，且x肯定在$[0, 1]$区间10等分后的某个小区间中，假设为$[\\frac{a_1}{10},\\frac{b_1}{10}]$，则$\\frac{a_1}{10} \\le x \\le \\frac{b_1}{10}$。接下来将$[\\frac{a_1}{10}, \\frac{b_1}{10}]$继续10等分，则会有\n$\\frac{a_1}{10} + \\frac{a_2}{100} \\le x \\le \\frac{b_1}{10} + \\frac{b_2}{100}$，如此一直重复下去，则有\n$$\\frac{a_1}{10} + \\frac{a_2}{100} + \\dots + \\frac{a_n}{10^n} \\le x \\le \\frac{b_1}{10} + \\frac{b_2}{100} + \\dots + \\frac{b_n}{10^n}$$为了方便，我们将其表示为$0.a_1a_2...a_n \\le x \\le 0.b_1b_2...b_n$，这种形式成为小数。\n不等式 三角不等式 对于任意实数a和b,有\n$$|a+b| \\le |a| + |b|$$Cauchy-Schwarz不等式 $$(a_1b_1 + a_2b_2 + \\dots + a_nb_n)^2 \\le (a_1^2 + a_2^2 + \\dots + a_n^2)(b_1^2 + b_2^2 + \\dots + b_n^2)$$函数的概念 函数即为两个集合之间的映射。广义的函数，其集合可以是任何元素，但在本书中，我们只关心由实数组成的各种集合。\n定义域、值域和连续变量的函数 定义域(Domain)：自变量的集合 值域(Range)：因变量的集合 当函数的定义域是由一个或多个interval组成的时候，就成这个函数是连续变量的函数。\n连续 函数的连续性，从直观上来看，就是当自变量x有很微小的变化时，对应的因变量$f(x)$也只有微小的变化，不会出现断点。用更形式化的语言来描述的话，就是：\n如果函数f在$x_0$出连续，则对于任意的正实数$\\epsilon \u003e 0$，都能找到相应的$\\delta \u003e 0$，使得当$|x - x_0| \u003c \\delta$时，都有$|f(x) - f(x_0)| \u003c \\epsilon$\n当然，认可上面的定义的前提是接受无穷小这个概念。\n一致连续 在连续的形式化证明中，对于任意的$\\epsilon \u003e 0$，如果能找到$\\delta = \\delta(\\epsilon)$，即$\\delta$的选取与$x_0$无关，则称$f$为一致连续。不难得知，连续函数在闭区间上肯定是一致连续的。\nLispchitz连续 在一致连续的前提下，如果$\\delta$ 与$\\epsilon$成线性关系，就是Lispchitz连续\nHolder连续 在一致连续的前提下，如果$\\delta$与$\\epsilon^a$, $0 \u003c a \\le 1$成线性关系，则为Holder连续\n中值定理 假设$f$在某一区间中连续，a,b是区间中的两点，且$a \u003c b $，则对于任一$\\eta$，其值在$f(a)$和$f(b)$之间，那么有$a \u003c \\xi \u003c b$，使得$f(\\xi) = \\eta$\n初等函数 初等函数包含一系列简单的函数和几个常见的超越函数：\n有理函数 代数函数 三角函数 指数函数 对数函数 复合函数 数学推导 数学推导法来自于自然数，即这样一个概念：\n对于集合$S$, 有如下几个条件：\n1 存在与$S$中 如果 正整数$x$存在于$S$中，则$x+1$也存在于$S$中 则$S$包含了所有的自然数\n序列的极限 几何级数 即等比数列的和\n极限的深入讨论 发散：即极限趋于无穷大 收敛：即极限趋于某一个固定的值$X$，或者将序列中的元素减去$X$后，趋于无穷 极限的有理运算 对于有理数的四则运算，极限也同样适用。\n连续变量函数的极限 对于连续函数$f$在$x_0$处的极限，可以当作是在$f$的定义域中，任意以$x_0$为极限的序列，如$x_1,x_2,\\dots,x_n,\\dots$，有如下关系：\n$$\\lim_{x \\to x_0} f(x) = \\lim_{i \\to \\infty} f(x_i)$$","permalink":"https://rmtt.github.io/zh/posts/calculus-chapter01/","summary":"\u003ch1 id=\"introduction-to-basic-conception\"\u003eIntroduction to basic conception\u003c/h1\u003e\n\u003ch2 id=\"the-continuum-of-numbers\"\u003eThe Continuum of Numbers\u003c/h2\u003e\n\u003cp\u003e首先，自然数可以认为是与生俱来的，但是普通的四则运算所产生的结果却不一定是自然运算，比如$1 - 1 = 0$ , $1 - 2 = -1$ , $1\\div2 =\\frac{1}{2}$都产生了结果不是自然数的情况。为了满足四则运算能更方便的使用，便引入了$0$ 、分数和负数，即有理数。\u003c/p\u003e\n\u003cp\u003e有理数的引入使得四则运算的适用范围更广，但有理数是否就能表示生活中所有能见到的物体的度量呢？答案是否定的，比如两个直角边都为1的直角三角形，根据毕达哥拉斯定理，其斜边的平方为$c^2 = 1^2 + 1^2$，但我们无法找到一个有理数，使得其平方为$2$，所以，有理数并不能满足所有的计算。\u003c/p\u003e\n\u003ch3 id=\"real-number-and-nested-interval\"\u003eReal Number and Nested Interval\u003c/h3\u003e\n\u003cp\u003e现在我们用数轴上的点来当作Continuum of Numbers的基本元素，其中每个点都对应一个实数x, 实数之间的大小关系就是其在数轴上的位置关系，比如x在y左边则$x \u003c y$.\u003c/p\u003e\n\u003cp\u003e我们已经知道有理数可以用两个整数p和q的商$\\frac{p}{q}$来定义，那该如何用已知的有理数或者自然数来定义无理数呢？数学中常用的一种做法是渐进，即找一个无限接近目标的序列，其项数越多，误差就越小。为了取得无理数x的渐进值，我们需要从两边同时靠近它(只考虑一边的话便没有终止条件)，即在其他左右两边各取一个有理数，比如$a_1$和$b_1$, 且$a_1 \u003c x$,$b_1 \u003e x$, 这样，就选取了一个包含x的区间$[a_1, b_1]$。然后，将$[a_1, b_1]$对半分，取其中包含x的区间$[a_2, b_2]$，则$a_1 \\le a_2 \u003c x$, $x \u003c b_2 \\le b_1$。同样的，我们可以继续二分$[a_2, b_2]$，并不断重复下去，则可以得到任意个包含x的区间，且$[a_n, b_n]$包含于$[a_{n+1}, b_{n+1}]$，我们称这样一个区间序列为\u003cstrong\u003e嵌套区间\u003c/strong\u003e 。很显然，每个区间与x的误差不超过$|b_n - a_n|$。\u003c/p\u003e\n\u003ch3 id=\"小数\"\u003e小数\u003c/h3\u003e\n\u003cp\u003e在前面的嵌套区间中，$a_n \u003c x \u003c b_n$。现在将数轴按以1为单位标记，然后将每个单位长度区间10等分。假设$0 \\le x \\le 1$，且x肯定在$[0, 1]$区间10等分后的某个小区间中，假设为$[\\frac{a_1}{10},\\frac{b_1}{10}]$，则$\\frac{a_1}{10} \\le x \\le \\frac{b_1}{10}$。接下来将$[\\frac{a_1}{10}, \\frac{b_1}{10}]$继续10等分，则会有\u003c/p\u003e","title":"Chapter01-Introduction to Calculus and Analysis Volume I"},{"content":"算法 什么是算法 形式上的定义 Informally, an algorithm is any well-defined computational procedure that takes some value, or set of values, as input and produces some value, or set of values, as output.\n个人理解 算法是CS中很多技术的基础，也应该是CS的核心所在。\n排序问题 插入排序 插入排序的过程跟打扑克时起牌的过程差不多，对于位置i的元素，在其前面找到应该插入的位置插入即可，复杂度是$\\theta(n^2)$。\n归并排序 归并排序就是将原序列递归分成多个小序列，然后合并的时候发现每个元素只需要$O(1)$的时间就可以确定其位置，比较次数较插入排序少了很多，所以复杂度比插入排序小，为$\\theta(nlogn)$。\n归并+插入 考虑到算法复杂度的常数，在数据规模较小时，插入排序可能会比归并更优，所以在归并排序中，当子序列规模小于k时，可采用插入排序来完成。\n延伸问题 逆序对 序列中，数值和位置的大小关系不匹配便可以称为一个逆序。思考一下，可以发现插入排序中，元素的比较次数就是序列中逆序对的个数，而归并排序中同样也能推算出所有的比较次数，故可以在$\\theta(nlogn)$的复杂度下解决该问题。\n","permalink":"https://rmtt.github.io/zh/posts/introduction_to_algorithm_chapter12/","summary":"\u003ch1 id=\"算法\"\u003e算法\u003c/h1\u003e\n\u003ch2 id=\"什么是算法\"\u003e什么是算法\u003c/h2\u003e\n\u003ch3 id=\"形式上的定义\"\u003e形式上的定义\u003c/h3\u003e\n\u003cp\u003eInformally, an \u003cstrong\u003ealgorithm\u003c/strong\u003e is any well-defined computational procedure that takes some value, or set of values, as \u003cstrong\u003einput\u003c/strong\u003e and produces some value, or set of values, as \u003cstrong\u003eoutput\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"个人理解\"\u003e个人理解\u003c/h3\u003e\n\u003cp\u003e算法是CS中很多技术的基础，也应该是CS的核心所在。\u003c/p\u003e\n\u003ch2 id=\"排序问题\"\u003e排序问题\u003c/h2\u003e\n\u003ch3 id=\"插入排序\"\u003e插入排序\u003c/h3\u003e\n\u003cp\u003e插入排序的过程跟打扑克时起牌的过程差不多，对于位置\u003ccode\u003ei\u003c/code\u003e的元素，在其前面找到应该插入的位置插入即可，复杂度是$\\theta(n^2)$。\u003c/p\u003e\n\u003ch3 id=\"归并排序\"\u003e归并排序\u003c/h3\u003e\n\u003cp\u003e归并排序就是将原序列递归分成多个小序列，然后合并的时候发现每个元素只需要$O(1)$的时间就可以确定其位置，比较次数较插入排序少了很多，所以复杂度比插入排序小，为$\\theta(nlogn)$。\u003c/p\u003e\n\u003ch3 id=\"归并插入\"\u003e归并+插入\u003c/h3\u003e\n\u003cp\u003e考虑到算法复杂度的常数，在数据规模较小时，插入排序可能会比归并更优，所以在归并排序中，当子序列规模小于\u003ccode\u003ek\u003c/code\u003e时，可采用插入排序来完成。\u003c/p\u003e\n\u003ch2 id=\"延伸问题\"\u003e延伸问题\u003c/h2\u003e\n\u003ch3 id=\"逆序对\"\u003e逆序对\u003c/h3\u003e\n\u003cp\u003e序列中，数值和位置的大小关系不匹配便可以称为一个逆序。思考一下，可以发现插入排序中，元素的比较次数就是序列中逆序对的个数，而归并排序中同样也能推算出所有的比较次数，故可以在$\\theta(nlogn)$的复杂度下解决该问题。\u003c/p\u003e","title":"算法导论 Chapter1\u00262"},{"content":"Introduction paper url: http://nil.csail.mit.edu/6.824/2020/papers/mapreduce.pdf\nWhy need distributed parallelism fault tolerance physical security or isolated Basic challenges concurrency partial failture performence Map Reduce 个人理解 MapReduce是一个比较直观而且可以分布式的编程框架，主要过程就是将数据（输入）分发到不同的task（map过程），然后将所有task的输出收集起来shuffle一下，然后分发给另外的task（reduce过程）。从目前（2021年）来看，这个编程模型的瓶颈应该是中间的shuffle过程，因为数据量非常大的时候，shuffle过程的网络IO量也非常大。\n关键点 MapReduce的编程模型很简单，但Google的论文中最有价值的部分是应该是关于容错和任务备份。\n容错 Worker容错 每个Task可以分为三个状态，idle/in-progress/completed，当task被分配给worker后，会由idle变为in-progress状态，当worker正常完成task时，会由in-progress变为completed。 当worker因意外或其他原因变得inavaible时，Task将会变成idle状态，然后master就可以将其重新分配给其他worker去完成。\nMaster容错 Master的错误比较暴力，直接做几个mirror就行了，如果没有mirror，那么当master出错时，整个系统就会宕机。\n任务备份 个人觉得是论文里一个不错的点，任务备份是当一个MapReduce操作（个人理解就是map和reduce)完成时，将当前in-progress的Task备份，然后当有空闲的worker时再将备份中的task分配过去执行。这样的好处是可以明显减少因为straggler的存在而导致的性能下降。\nstraggler指因为磁盘、网络等原因而造成性能下降的Worker\npersonal idea 因为在实际情况中，每个Worker都会因为各种因素而产生性能上的差距。同时，Master中也记录了每个task的完成时间，感觉可以用完成时间的平均值（或者之类的）来将worker放到一颗平衡树里面，然后优先用效率高的worker去完成task。\n","permalink":"https://rmtt.github.io/zh/posts/ds-lec1/","summary":"\u003ch1 id=\"introduction\"\u003eIntroduction\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003epaper url: \u003ca href=\"http://nil.csail.mit.edu/6.824/2020/papers/mapreduce.pdf\"\u003ehttp://nil.csail.mit.edu/6.824/2020/papers/mapreduce.pdf\u003c/a\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"why-need-distributed\"\u003eWhy need distributed\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eparallelism\u003c/li\u003e\n\u003cli\u003efault tolerance\u003c/li\u003e\n\u003cli\u003ephysical\u003c/li\u003e\n\u003cli\u003esecurity or isolated\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"basic-challenges\"\u003eBasic challenges\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003econcurrency\u003c/li\u003e\n\u003cli\u003epartial failture\u003c/li\u003e\n\u003cli\u003eperformence\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"map-reduce\"\u003eMap Reduce\u003c/h2\u003e\n\u003ch3 id=\"个人理解\"\u003e个人理解\u003c/h3\u003e\n\u003cp\u003eMapReduce是一个比较直观而且可以分布式的编程框架，主要过程就是将数据（输入）分发到不同的task（map过程），然后将所有task的输出收集起来shuffle一下，然后分发给另外的task（reduce过程）。从目前（2021年）来看，这个编程模型的瓶颈应该是中间的shuffle过程，因为数据量非常大的时候，shuffle过程的网络IO量也非常大。\u003c/p\u003e\n\u003ch3 id=\"关键点\"\u003e关键点\u003c/h3\u003e\n\u003cp\u003eMapReduce的编程模型很简单，但Google的论文中最有价值的部分是应该是关于容错和任务备份。\u003c/p\u003e\n\u003ch4 id=\"容错\"\u003e容错\u003c/h4\u003e\n\u003ch5 id=\"worker容错\"\u003eWorker容错\u003c/h5\u003e\n\u003cp\u003e每个Task可以分为三个状态，\u003ccode\u003eidle\u003c/code\u003e/\u003ccode\u003ein-progress\u003c/code\u003e/\u003ccode\u003ecompleted\u003c/code\u003e，当task被分配给worker后，会由\u003ccode\u003eidle\u003c/code\u003e变为\u003ccode\u003ein-progress\u003c/code\u003e状态，当worker正常完成task时，会由\u003ccode\u003ein-progress\u003c/code\u003e变为\u003ccode\u003ecompleted\u003c/code\u003e。\n当worker因意外或其他原因变得\u003ccode\u003einavaible\u003c/code\u003e时，Task将会变成\u003ccode\u003eidle\u003c/code\u003e状态，然后master就可以将其重新分配给其他worker去完成。\u003c/p\u003e\n\u003ch5 id=\"master容错\"\u003eMaster容错\u003c/h5\u003e\n\u003cp\u003eMaster的错误比较暴力，直接做几个\u003ccode\u003emirror\u003c/code\u003e就行了，如果没有\u003ccode\u003emirror\u003c/code\u003e，那么当master出错时，整个系统就会宕机。\u003c/p\u003e\n\u003ch4 id=\"任务备份\"\u003e任务备份\u003c/h4\u003e\n\u003cp\u003e个人觉得是论文里一个不错的点，任务备份是当一个MapReduce操作（个人理解就是map和reduce)完成时，将当前\u003ccode\u003ein-progress\u003c/code\u003e的Task备份，然后当有空闲的worker时再将备份中的task分配过去执行。这样的好处是可以明显减少因为\u003ccode\u003estraggler\u003c/code\u003e的存在而导致的性能下降。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003estraggler指因为磁盘、网络等原因而造成性能下降的Worker\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch3 id=\"personal-idea\"\u003epersonal idea\u003c/h3\u003e\n\u003cp\u003e因为在实际情况中，每个Worker都会因为各种因素而产生性能上的差距。同时，Master中也记录了每个task的完成时间，感觉可以用完成时间的平均值（或者之类的）来将worker放到一颗平衡树里面，然后优先用效率高的worker去完成task。\u003c/p\u003e","title":"MIT 6.824 Lec1 分布式：MapReduce"},{"content":"My Archlinux desktop configuratoins Basic setup Desktop Environment KDE Bismuth Fonts Apple Developer fonts Wenquanyi Sarasa FiraCode Nerd mono App icons Tela Dotfiles Apply dotfiles from my own repo\nSoftwares for daily use qView: image viewer thunar: graphical file manager ranger: console file manager Typora: writing articles Thunderbird: mail and rss client Yesplaymusic: music player Zotero: PDF/paper read and management ","permalink":"https://rmtt.github.io/zh/posts/linux_desktop_config/","summary":"\u003ch1 id=\"my-archlinux-desktop-configuratoins\"\u003eMy Archlinux desktop configuratoins\u003c/h1\u003e\n\u003ch2 id=\"basic-setup\"\u003eBasic setup\u003c/h2\u003e\n\u003ch3 id=\"desktop-environment\"\u003eDesktop Environment\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eKDE\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Bismuth-Forge/bismuth\"\u003eBismuth\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"fonts\"\u003eFonts\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://developer.apple.com/fonts/\"\u003eApple Developer fonts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWenquanyi\u003c/li\u003e\n\u003cli\u003eSarasa\u003c/li\u003e\n\u003cli\u003eFiraCode Nerd mono\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"app-icons\"\u003eApp icons\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eTela\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dotfiles\"\u003eDotfiles\u003c/h3\u003e\n\u003cp\u003eApply dotfiles from my own repo\u003c/p\u003e\n\u003ch2 id=\"softwares-for-daily-use\"\u003eSoftwares for daily use\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eqView: image viewer\u003c/li\u003e\n\u003cli\u003ethunar: graphical file manager\u003c/li\u003e\n\u003cli\u003eranger: console file manager\u003c/li\u003e\n\u003cli\u003eTypora: writing articles\u003c/li\u003e\n\u003cli\u003eThunderbird: mail and rss client\u003c/li\u003e\n\u003cli\u003eYesplaymusic: music player\u003c/li\u003e\n\u003cli\u003eZotero: PDF/paper read and management\u003c/li\u003e\n\u003c/ul\u003e","title":"Arch Linux 桌面配置"},{"content":"数电设计和计算机结构：从0到1（第一章） 计算机的抽象结构 Application Software: Programs Operating Systems: Device Drivers Architecture: Instructions Registers Microarchitecture: Datapaths Controllers Logic: Adders Memories Digital Circuits: AND Gates/NOT Gates Analog Circuits: Amplifiers Filters Devices: Transistors Diodes Physics: Electrons 二进制 信息量 N种状态需要$ log_2{N} $个Bit\n补码 我们一般学习补码都是分正数和负数，正数不变，负数将对应的绝对值按位取反再加1。不过在这本书中学到了一个新的角度：将MSB(二进制最高位)的全值当成$ -2^{N-1}$即可，这样看补码的话也更直观一些。\n逻辑门 基本的一些门电路 AND OR NOT NAND XOR NOR Buffer Logical level 数字电路处理的是离散量，比如电压只有高电平和低电平（一般用1和0表示），但实际上电路中的电压是连续变化的，那么怎么把连续的量转化为离散的量呢？\n逻辑门的输入输出电压 逻辑门的输入输出中，所用的高电平和低电平的范围可能会不相同。对于输出，高电平一般是在$V_{OH} - V_{DD}$之间，而低电平是在$GND - V_{OL}$之间。而当门电路读取输入时，低电平一般是在$GND-V_{IL}$之间，高电平是在$V_{IH} - V_{DD}$之间，这样的话，在一套逻辑电路内，必须要有:\n$$ V_{OL} \\leq V_{IL} $$$$ V_{OH} \\leq V_{IH} $$而他们的差值就是能容忍的噪声。\n如何选择$V_{OL}$、$V_{OH}$等 对于理想的逻辑电路，低电平就是0，高电平就是$V_{DD}$，所以$V_{OL} = V_{IL} = 0$，$V_{OH} = V_{IH} = V_{DD}$。\n但在实际中，电压是连续变化的，如下图所示（该图是一个NOT逻辑门的电压变化图，V(A)是输入，V(Y)是输出）：\n一种选择是将斜率为1和-1的点选为临界点，这些点被成为Unity Gain Points。对于在$V_{IL}$和$V_{IH}$之间的区域，被称为禁止区，如果输入的电压在禁止区内，那门电路的行为是无法判断的。\n一些标准 逻辑门的电压临界值原理上是可以由设计者自己决定，但为了方便不同零件的组合，工业上也有一些常用的标准：\nTTL CMOS LVTTL LVCMOS 上述标准都有自己的$V_{OL}$、$V_{OH}$、$V_{IL}$、$V_{IH}$等等，不一定能兼容。\n","permalink":"https://rmtt.github.io/zh/posts/digital-design-chapter-01/","summary":"\u003ch1 id=\"数电设计和计算机结构从0到1第一章\"\u003e数电设计和计算机结构：从0到1（第一章）\u003c/h1\u003e\n\u003ch2 id=\"计算机的抽象结构\"\u003e计算机的抽象结构\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eApplication Software: Programs\u003c/li\u003e\n\u003cli\u003eOperating Systems: Device Drivers\u003c/li\u003e\n\u003cli\u003eArchitecture: Instructions Registers\u003c/li\u003e\n\u003cli\u003eMicroarchitecture: Datapaths Controllers\u003c/li\u003e\n\u003cli\u003eLogic: Adders Memories\u003c/li\u003e\n\u003cli\u003eDigital Circuits: AND Gates/NOT Gates\u003c/li\u003e\n\u003cli\u003eAnalog Circuits: Amplifiers Filters\u003c/li\u003e\n\u003cli\u003eDevices: Transistors Diodes\u003c/li\u003e\n\u003cli\u003ePhysics: Electrons\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"二进制\"\u003e二进制\u003c/h2\u003e\n\u003ch3 id=\"信息量\"\u003e信息量\u003c/h3\u003e\n\u003cp\u003eN种状态需要$ log_2{N} $个Bit\u003c/p\u003e\n\u003ch3 id=\"补码\"\u003e补码\u003c/h3\u003e\n\u003cp\u003e我们一般学习补码都是分正数和负数，正数不变，负数将对应的绝对值按位取反再加1。不过在这本书中学到了一个新的角度：将MSB(二进制最高位)的全值当成$  -2^{N-1}$即可，这样看补码的话也更直观一些。\u003c/p\u003e\n\u003ch2 id=\"逻辑门\"\u003e逻辑门\u003c/h2\u003e\n\u003ch3 id=\"基本的一些门电路\"\u003e基本的一些门电路\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eAND\u003c/li\u003e\n\u003cli\u003eOR\u003c/li\u003e\n\u003cli\u003eNOT\u003c/li\u003e\n\u003cli\u003eNAND\u003c/li\u003e\n\u003cli\u003eXOR\u003c/li\u003e\n\u003cli\u003eNOR\u003c/li\u003e\n\u003cli\u003eBuffer\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"logical-level\"\u003eLogical level\u003c/h3\u003e\n\u003cp\u003e数字电路处理的是离散量，比如电压只有高电平和低电平（一般用1和0表示），但实际上电路中的电压是连续变化的，那么怎么把连续的量转化为离散的量呢？\u003c/p\u003e\n\u003ch4 id=\"逻辑门的输入输出电压\"\u003e逻辑门的输入输出电压\u003c/h4\u003e\n\u003cp\u003e\u003cimg alt=\"逻辑门的输入输出\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/digital-design-chapter-01/1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e逻辑门的输入输出中，所用的高电平和低电平的范围可能会不相同。对于输出，高电平一般是在$V_{OH} - V_{DD}$之间，而低电平是在$GND - V_{OL}$之间。而当门电路读取输入时，低电平一般是在$GND-V_{IL}$之间，高电平是在$V_{IH} - V_{DD}$之间，这样的话，在一套逻辑电路内，必须要有:\u003c/p\u003e\n$$ V_{OL} \\leq V_{IL} $$$$ V_{OH} \\leq V_{IH} $$\u003cp\u003e而他们的差值就是能容忍的噪声。\u003c/p\u003e","title":"数电设计和计算机结构：从0到1"},{"content":"Linux日常使用 应用推荐 阅读+笔记 Masterpdfeditor 全平台的PDF编辑器，日常阅读+标注可以满足需求，完整版需付费。\nXMind 思维导图软件，全平台，简单好用。\nZotero 文献管理软件，配合zotfile和云盘可以实现多端同步。\n云同步 Google Drive 某知名网盘。\nInsync Google Drive和Onedrive的客户端，全平台，授权费30刀（终身），还算好用。\n开发 IDE Jetbrains JB全家桶，全平台。\nNeovim 用neovim开发也是个不错的选择，配合coc和其他自己喜欢的插件，也有不错的体验，而且资源消耗比JB之类的IDE少很多。\n浏览器 Chromium 日常使用和Chrome的差别感觉不是很大，也可以同步Google帐号的数据。\n杂项 Thunderbird 邮件客户端 + RSS客户端，免费好用。\nKeepassXC 密码管理器kepass的一个GUI前端，免费，界面也还不错，全平台。\nTypora Markdown写作软件，用来写博客非常不错，免费全平台。\nGoldendict 字典软件，免费全平台，很方便，字典需另外需找，目前使用的是：\n牛津10 新世纪日汉双解大辞典(精) ","permalink":"https://rmtt.github.io/zh/posts/applications-recommand/","summary":"\u003ch1 id=\"linux日常使用-应用推荐\"\u003eLinux日常使用 应用推荐\u003c/h1\u003e\n\u003ch2 id=\"阅读笔记\"\u003e阅读+笔记\u003c/h2\u003e\n\u003ch3 id=\"masterpdfeditor\"\u003eMasterpdfeditor\u003c/h3\u003e\n\u003cp\u003e全平台的PDF编辑器，日常阅读+标注可以满足需求，完整版需付费。\u003c/p\u003e\n\u003ch3 id=\"xmind\"\u003eXMind\u003c/h3\u003e\n\u003cp\u003e思维导图软件，全平台，简单好用。\u003c/p\u003e\n\u003ch3 id=\"zotero\"\u003eZotero\u003c/h3\u003e\n\u003cp\u003e文献管理软件，配合zotfile和云盘可以实现多端同步。\u003c/p\u003e\n\u003ch2 id=\"云同步\"\u003e云同步\u003c/h2\u003e\n\u003ch3 id=\"google-drive\"\u003eGoogle Drive\u003c/h3\u003e\n\u003cp\u003e某知名网盘。\u003c/p\u003e\n\u003ch3 id=\"insync\"\u003eInsync\u003c/h3\u003e\n\u003cp\u003eGoogle Drive和Onedrive的客户端，全平台，授权费30刀（终身），还算好用。\u003c/p\u003e\n\u003ch2 id=\"开发\"\u003e开发\u003c/h2\u003e\n\u003ch3 id=\"ide\"\u003eIDE\u003c/h3\u003e\n\u003ch4 id=\"jetbrains\"\u003eJetbrains\u003c/h4\u003e\n\u003cp\u003eJB全家桶，全平台。\u003c/p\u003e\n\u003ch4 id=\"neovim\"\u003eNeovim\u003c/h4\u003e\n\u003cp\u003e用neovim开发也是个不错的选择，配合coc和其他自己喜欢的插件，也有不错的体验，而且资源消耗比JB之类的IDE少很多。\u003c/p\u003e\n\u003ch2 id=\"浏览器\"\u003e浏览器\u003c/h2\u003e\n\u003ch3 id=\"chromium\"\u003eChromium\u003c/h3\u003e\n\u003cp\u003e日常使用和Chrome的差别感觉不是很大，也可以同步Google帐号的数据。\u003c/p\u003e\n\u003ch2 id=\"杂项\"\u003e杂项\u003c/h2\u003e\n\u003ch3 id=\"thunderbird\"\u003eThunderbird\u003c/h3\u003e\n\u003cp\u003e邮件客户端 + RSS客户端，免费好用。\u003c/p\u003e\n\u003ch3 id=\"keepassxc\"\u003eKeepassXC\u003c/h3\u003e\n\u003cp\u003e密码管理器kepass的一个GUI前端，免费，界面也还不错，全平台。\u003c/p\u003e\n\u003ch3 id=\"typora\"\u003eTypora\u003c/h3\u003e\n\u003cp\u003eMarkdown写作软件，用来写博客非常不错，免费全平台。\u003c/p\u003e\n\u003ch3 id=\"goldendict\"\u003eGoldendict\u003c/h3\u003e\n\u003cp\u003e字典软件，免费全平台，很方便，字典需另外需找，目前使用的是：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e牛津10\u003c/li\u003e\n\u003cli\u003e新世纪日汉双解大辞典(精)\u003c/li\u003e\n\u003c/ul\u003e","title":"Linux日常使用 应用推荐"},{"content":"JavaScript学习总结 基础语法 js基础的语法和C/C++等众多语言类似，有8种基本类型：\nstring number boolean null undefined object symbol bigint 以及流程控制和循环语句等：\nif switch for for .. in for .. of while do .. while JS Object 在js中，除了几个基本类型，其他基本都可以当成是Object。而Object这个对象就是JS中最基本的Object, 除了使用Object.create(null)创建的对象，其他对象都会默认使用Object.prototype作为自己的[[Prototype]]。如下是JS中几种主要Object的导图：\nFunction JS中的function也是Object, 只不过是可以“执行”的Object。要注意的是，js中的this变量的处理与其他语言不太一样，this指向的是调用该函数的对象，比如a.hi()，调用hi()的时候，this指向的是a这个object, 而用b.hi()时则是指向b这个object。\nThis 在JS中，当调用Object里面的函数时，并不能用变量名直接访问对象的其他property，而是必须通过this变量。一般情况下，this就是指向调用对象的一个指针。\nArrow function JS的箭头函数() =\u0026gt; xxx除了是简化的函数外，还有一点比较特殊：没有this，所以箭头函数会直接使用调用环境下的this。\nClosure JS中闭包其实就是上下文或者说Environment的复制（估计解释型语言应该都是这样）再加上JS的垃圾回收机制（一个对象没有任何引用或者一组与Global无关的对象才会被自动回收）。Environment就是执行时的层级，其中记录了当前Block下的各种变量。比如：\nfunction a(){ let count = 0; return function(){ count++; } } let b = a(); 当如上代码执行时，会先创建一个a的Environment，然后再创建被返回的那个匿名函数的Environment，因为匿名函数被b引用，而a的Environment会被匿名函数引用，便形成了一个闭包。\nPrototype JS中的prototype是Object的一个特殊的属性，当访问Object的属性或者函数时，如果没有找到相应的，则会去prototype中寻找，因此我们可以用prototype来实现继承关系。因为prototype本身也是一个Object，所以可以有很多层的继承。实例的__proto__属性是真正的prototype的一个setter/getter，对于真正的prototype，一般用[[Prototype]]表示。\n在函数和Class中，有一个prototype的属性，注意这个属性并不是上面所讲的prototype。函数和Class的prototype属性是用来给实例的__proto__或者说[[Prototype]]赋值的，需要使用new操作符。比如：\nfunction User(){ this.name = \u0026#34;John\u0026#34;; } User.prototype = { name: \u0026#34;IIa\u0026#34; } let user = new User; console.log(User.prototype == user.__proto__); Class Class是JS为OOP设计的一个结构，跟其他OOP语言一样有成员、方法，可以继承，有静态变量和方法，但是如下特性还只在最近的浏览器版本中部分实现：\n静态成员 私有成员或函数(#) JS的Class本质上也是一个Function, 只不过把constructor体现的更明显，其中super关键字也可以在普通Object中使用。\nPromise Promise是JS提供的一个Async模型，类似生产-消费者模型。Promise的基本用法如下：\nnew Promise(function(resolve, error){ // 生产内容 ... // 发给消费者 resolve(...) // 生产成功 // or error(new Error(...)) // 生产失败 } ).then(result =\u0026gt; ..., error =\u0026gt; ...) // 消费者 .catch(error =\u0026gt; ..); // 消费者 Promise中的消费者是按从上到下的顺序放入队列中，队列中上一个消费者返回的内容会被传递给下一个消费者。\nasync \u0026amp; await async和await个人觉得就是Promise的语法糖，本质上就是Promise，比如如下代码：\nasync function f(){} let result = await f(); 其中，async相当于把f封装在了Promise里面：\nnew Promise((resolve, error) =\u0026gt; { resolve(f()); ... }); 而await则类似then，只不过会阻塞线程。\n参考 The Modern JavaScript Tutorial ","permalink":"https://rmtt.github.io/zh/posts/js-study/","summary":"\u003ch1 id=\"javascript学习总结\"\u003eJavaScript学习总结\u003c/h1\u003e\n\u003ch2 id=\"基础语法\"\u003e基础语法\u003c/h2\u003e\n\u003cp\u003ejs基础的语法和C/C++等众多语言类似，有8种基本类型：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003estring\u003c/li\u003e\n\u003cli\u003enumber\u003c/li\u003e\n\u003cli\u003eboolean\u003c/li\u003e\n\u003cli\u003enull\u003c/li\u003e\n\u003cli\u003eundefined\u003c/li\u003e\n\u003cli\u003eobject\u003c/li\u003e\n\u003cli\u003esymbol\u003c/li\u003e\n\u003cli\u003ebigint\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e以及流程控制和循环语句等：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eif\u003c/li\u003e\n\u003cli\u003eswitch\u003c/li\u003e\n\u003cli\u003efor\u003c/li\u003e\n\u003cli\u003efor .. in\u003c/li\u003e\n\u003cli\u003efor .. of\u003c/li\u003e\n\u003cli\u003ewhile\u003c/li\u003e\n\u003cli\u003edo .. while\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"js-object\"\u003eJS Object\u003c/h2\u003e\n\u003cp\u003e在js中，除了几个基本类型，其他基本都可以当成是Object。而Object这个对象就是JS中最基本的Object, 除了使用\u003ccode\u003eObject.create(null)\u003c/code\u003e创建的对象，其他对象都会默认使用\u003ccode\u003eObject.prototype\u003c/code\u003e作为自己的\u003ccode\u003e[[Prototype]]\u003c/code\u003e。如下是JS中几种主要Object的导图：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"JS Object\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/js-study/object.png\"\u003e\u003c/p\u003e\n\u003ch3 id=\"function\"\u003eFunction\u003c/h3\u003e\n\u003cp\u003eJS中的function也是Object, 只不过是可以“执行”的Object。要注意的是，js中的\u003ccode\u003ethis\u003c/code\u003e变量的处理与其他语言不太一样，\u003ccode\u003ethis\u003c/code\u003e指向的是调用该函数的对象，比如\u003ccode\u003ea.hi()\u003c/code\u003e，调用\u003ccode\u003ehi()\u003c/code\u003e的时候，\u003ccode\u003ethis\u003c/code\u003e指向的是a这个object, 而用\u003ccode\u003eb.hi()\u003c/code\u003e时则是指向b这个object。\u003c/p\u003e\n\u003ch4 id=\"this\"\u003eThis\u003c/h4\u003e\n\u003cp\u003e在JS中，当调用Object里面的函数时，并不能用变量名直接访问对象的其他property，而是必须通过\u003ccode\u003ethis\u003c/code\u003e变量。一般情况下，\u003ccode\u003ethis\u003c/code\u003e就是指向调用对象的一个指针。\u003c/p\u003e\n\u003ch4 id=\"arrow-function\"\u003eArrow function\u003c/h4\u003e\n\u003cp\u003eJS的箭头函数\u003ccode\u003e() =\u0026gt; xxx\u003c/code\u003e除了是简化的函数外，还有一点比较特殊：没有\u003ccode\u003ethis\u003c/code\u003e，所以箭头函数会直接使用调用环境下的\u003ccode\u003ethis\u003c/code\u003e。\u003c/p\u003e\n\u003ch4 id=\"closure\"\u003eClosure\u003c/h4\u003e\n\u003cp\u003eJS中闭包其实就是上下文或者说Environment的复制（估计解释型语言应该都是这样）再加上JS的垃圾回收机制（一个对象没有任何引用或者一组与Global无关的对象才会被自动回收）。Environment就是执行时的层级，其中记录了当前Block下的各种变量。比如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003ecount\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003ecount\u003c/span\u003e\u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eb\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003ea\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e当如上代码执行时，会先创建一个\u003ccode\u003ea\u003c/code\u003e的Environment，然后再创建被返回的那个匿名函数的Environment，因为匿名函数被\u003ccode\u003eb\u003c/code\u003e引用，而a的Environment会被匿名函数引用，便形成了一个闭包。\u003c/p\u003e\n\u003ch3 id=\"prototype\"\u003ePrototype\u003c/h3\u003e\n\u003cp\u003eJS中的\u003ccode\u003eprototype\u003c/code\u003e是\u003ccode\u003eObject\u003c/code\u003e的一个特殊的属性，当访问\u003ccode\u003eObject\u003c/code\u003e的属性或者函数时，如果没有找到相应的，则会去\u003ccode\u003eprototype\u003c/code\u003e中寻找，因此我们可以用\u003ccode\u003eprototype\u003c/code\u003e来实现继承关系。因为\u003ccode\u003eprototype\u003c/code\u003e本身也是一个\u003ccode\u003eObject\u003c/code\u003e，所以可以有很多层的继承。实例的\u003ccode\u003e__proto__\u003c/code\u003e属性是真正的\u003ccode\u003eprototype\u003c/code\u003e的一个setter/getter，对于真正的prototype，一般用\u003ccode\u003e[[Prototype]]\u003c/code\u003e表示。\u003c/p\u003e\n\u003cp\u003e在函数和Class中，有一个\u003ccode\u003eprototype\u003c/code\u003e的属性，注意这个属性并不是上面所讲的\u003ccode\u003eprototype\u003c/code\u003e。函数和Class的\u003ccode\u003eprototype\u003c/code\u003e属性是用来给实例的\u003ccode\u003e__proto__\u003c/code\u003e或者说\u003ccode\u003e[[Prototype]]\u003c/code\u003e赋值的，需要使用\u003ccode\u003enew\u003c/code\u003e操作符。比如：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-javascript\" data-lang=\"javascript\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e \u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ethis\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ename\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;John\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003ename\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;IIa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003euser\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eUser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eprototype\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"nx\"\u003euser\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003e__proto__\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"class\"\u003eClass\u003c/h3\u003e\n\u003cp\u003eClass是JS为OOP设计的一个结构，跟其他OOP语言一样有成员、方法，可以继承，有静态变量和方法，但是如下特性还只在最近的浏览器版本中部分实现：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e静态成员\u003c/li\u003e\n\u003cli\u003e私有成员或函数(#)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJS的Class本质上也是一个Function, 只不过把\u003ccode\u003econstructor\u003c/code\u003e体现的更明显，其中\u003ccode\u003esuper\u003c/code\u003e关键字也可以在普通Object中使用。\u003c/p\u003e","title":"JavaScript学习总结"},{"content":"红黑树(C++) 红黑树性质 每个节点只能是红色或者黑色\n根节点是黑色\n叶子节点是黑色\n红色节点的子节点必须是黑色\n任一节点到其子树叶子节点的所有简单路径具有相同数量的黑色节点\n插入 共6种情况，其中33对称，实际上就3种\n删除 共8种情况，其中44对称，实际上就4种\n代码实现 #include \u0026lt;algorithm\u0026gt; #include \u0026lt;iostream\u0026gt; using namespace std; enum Color { RED, BLACK }; template\u0026lt;typename T\u0026gt; class Node { public: Node *parent, *left, *right; T key; Color color; Node(T key, Color color = RED) : key(key), color(color) { parent = nullptr; left = nullptr; right = nullptr; } Node() : Node(0) { } }; template\u0026lt;typename T\u0026gt; class RBT { private: Node\u0026lt;T\u0026gt; *nil; Node\u0026lt;T\u0026gt; *root; public: RBT() { nil = new Node\u0026lt;T\u0026gt;(0, BLACK); root = nil; } void leftRotate(Node\u0026lt;T\u0026gt; *x) { Node\u0026lt;T\u0026gt; *y = x-\u0026gt;right; x-\u0026gt;right = y-\u0026gt;left; if (y-\u0026gt;left != nil) { y-\u0026gt;left-\u0026gt;parent = x; } y-\u0026gt;parent = x-\u0026gt;parent; if (x-\u0026gt;parent == nil) { root = y; } else if (x == x-\u0026gt;parent-\u0026gt;left) { x-\u0026gt;parent-\u0026gt;left = y; } else { x-\u0026gt;parent-\u0026gt;right = y; } y-\u0026gt;left = x; x-\u0026gt;parent = y; } void rightRotate(Node\u0026lt;T\u0026gt; *y) { Node\u0026lt;T\u0026gt; *x = y-\u0026gt;left; y-\u0026gt;left = x-\u0026gt;right; if (y-\u0026gt;left != nil) { y-\u0026gt;left-\u0026gt;parent = x; } x-\u0026gt;parent = y-\u0026gt;parent; if (y-\u0026gt;parent == nil) { root = x; } else if (y-\u0026gt;parent-\u0026gt;left == y) { y-\u0026gt;parent-\u0026gt;left = x; } else { y-\u0026gt;parent-\u0026gt;right = x; } x-\u0026gt;right = y; y-\u0026gt;parent = x; } void insert(Node\u0026lt;T\u0026gt; *z) { Node\u0026lt;T\u0026gt; *y = nil; Node\u0026lt;T\u0026gt; *x = root; while (x != nil) { y = x; if (z-\u0026gt;key \u0026lt; x-\u0026gt;key) x = x-\u0026gt;left; else x = x-\u0026gt;right; } z-\u0026gt;parent = y; if (y == nil) { root = z; } else if (z-\u0026gt;key \u0026lt; y-\u0026gt;key) { y-\u0026gt;left = z; } else { y-\u0026gt;right = z; } z-\u0026gt;left = nil; z-\u0026gt;right = nil; z-\u0026gt;color = RED; insert_fixup(z); } void insert_fixup(Node\u0026lt;T\u0026gt; *z) { while (z-\u0026gt;parent-\u0026gt;color == RED) { if (z-\u0026gt;parent == z-\u0026gt;parent-\u0026gt;parent-\u0026gt;left) { Node\u0026lt;T\u0026gt; *y = z-\u0026gt;parent-\u0026gt;parent-\u0026gt;right; if (y-\u0026gt;color == RED) { z-\u0026gt;parent-\u0026gt;color = BLACK; y-\u0026gt;color = BLACK; z-\u0026gt;parent-\u0026gt;parent-\u0026gt;color = RED; z = z-\u0026gt;parent-\u0026gt;parent; } else { if (z == z-\u0026gt;parent-\u0026gt;right) { z = z-\u0026gt;parent; leftRotate(z); } z-\u0026gt;parent-\u0026gt;color = BLACK; z-\u0026gt;parent-\u0026gt;parent-\u0026gt;color = RED; rightRotate(z-\u0026gt;parent-\u0026gt;parent); } } else { Node\u0026lt;T\u0026gt; *y = z-\u0026gt;parent-\u0026gt;parent-\u0026gt;left; if (y-\u0026gt;color == RED) { z-\u0026gt;parent-\u0026gt;color = BLACK; y-\u0026gt;color = BLACK; z-\u0026gt;parent-\u0026gt;parent-\u0026gt;color = RED; z = z-\u0026gt;parent-\u0026gt;parent; } else { if (z == z-\u0026gt;parent-\u0026gt;left) { z = z-\u0026gt;parent; rightRotate(z); } z-\u0026gt;parent-\u0026gt;color = BLACK; z-\u0026gt;parent-\u0026gt;parent-\u0026gt;color = RED; leftRotate(z-\u0026gt;parent-\u0026gt;parent); } } } root-\u0026gt;color = BLACK; } void transplant(Node\u0026lt;T\u0026gt; *u, Node\u0026lt;T\u0026gt; *v) { if (u-\u0026gt;parent == nil) root = v; else if (u-\u0026gt;parent-\u0026gt;left == u) u-\u0026gt;parent-\u0026gt;left = v; else u-\u0026gt;parent-\u0026gt;right = v; v-\u0026gt;parent = u-\u0026gt;parent; } Node\u0026lt;T\u0026gt; *minimum(Node\u0026lt;T\u0026gt; *u) { while (u != nil \u0026amp;\u0026amp; u-\u0026gt;left != nil) u = u-\u0026gt;left; return u; } void remove(Node\u0026lt;T\u0026gt; *z) { Node\u0026lt;T\u0026gt; *y = z, *x; Color origin_y = y-\u0026gt;color; if (z-\u0026gt;left == nil) { x = z-\u0026gt;right; transplant(z, z-\u0026gt;right); } else if (z-\u0026gt;right == nil) { x = z-\u0026gt;left; transplant(z, z-\u0026gt;left); } else { y = minimum(z-\u0026gt;right); origin_y = y-\u0026gt;color; x = y-\u0026gt;right; if (y-\u0026gt;parent == z) x-\u0026gt;parent = z; else { transplant(y, y-\u0026gt;right); y-\u0026gt;left = z-\u0026gt;left; y-\u0026gt;left-\u0026gt;parent = y; y-\u0026gt;color = z-\u0026gt;color; } transplant(z, y); y-\u0026gt;left = z-\u0026gt;left; y-\u0026gt;left-\u0026gt;parent = y; y-\u0026gt;color = z-\u0026gt;color; } if (origin_y == BLACK) { remove_fixup(x); } } void remove_fixup(Node\u0026lt;T\u0026gt; *x) { while (x != root \u0026amp;\u0026amp; x-\u0026gt;color == BLACK) { if (x == x-\u0026gt;parent-\u0026gt;left) { Node\u0026lt;T\u0026gt; *w = x-\u0026gt;parent-\u0026gt;right; if (w-\u0026gt;color == RED) { w-\u0026gt;color = BLACK; x-\u0026gt;parent-\u0026gt;color = RED; leftRotate(x-\u0026gt;parent); w = x-\u0026gt;parent-\u0026gt;right; } if (w-\u0026gt;left-\u0026gt;color == BLACK \u0026amp;\u0026amp; w-\u0026gt;right-\u0026gt;color == BLACK) { w-\u0026gt;color = RED; x = x-\u0026gt;parent; } else { if (w-\u0026gt;right-\u0026gt;color == BLACK) { w-\u0026gt;left-\u0026gt;color = BLACK; w-\u0026gt;color = RED; rightRotate(w); w = x-\u0026gt;parent-\u0026gt;right; } w-\u0026gt;color = x-\u0026gt;parent-\u0026gt;color; x-\u0026gt;parent-\u0026gt;color = BLACK; w-\u0026gt;right-\u0026gt;color = BLACK; leftRotate(x-\u0026gt;parent); x = root; } } else { Node\u0026lt;T\u0026gt; *w = x-\u0026gt;parent-\u0026gt;left; if (w-\u0026gt;color == RED) { w-\u0026gt;color = BLACK; x-\u0026gt;parent-\u0026gt;color = RED; rightRotate(x-\u0026gt;parent); w = x-\u0026gt;parent-\u0026gt;left; } if (w-\u0026gt;left-\u0026gt;color == BLACK \u0026amp;\u0026amp; w-\u0026gt;right-\u0026gt;color == BLACK) { w-\u0026gt;color = RED; x = x-\u0026gt;parent; } else { if (w-\u0026gt;left-\u0026gt;color == BLACK) { w-\u0026gt;right-\u0026gt;color = BLACK; w-\u0026gt;color = RED; leftRotate(w); w = x-\u0026gt;parent-\u0026gt;left; } w-\u0026gt;color = x-\u0026gt;parent-\u0026gt;color; x-\u0026gt;parent-\u0026gt;color = BLACK; w-\u0026gt;left-\u0026gt;color = BLACK; rightRotate(x-\u0026gt;parent); x = root; } } } x-\u0026gt;color = BLACK; } }; // test for number 1-100 int main() { auto *nodes = new Node\u0026lt;int\u0026gt;[100]; for (int i = 0; i \u0026lt; 100; ++i) (nodes + i)-\u0026gt;key = i + 1; RBT\u0026lt;int\u0026gt; T; for (int i = 0; i \u0026lt; 100; ++i) { T.insert(nodes + i); } for (int i = 0; i \u0026lt; 95; ++i) T.remove(nodes + i); return 0; } ","permalink":"https://rmtt.github.io/zh/posts/rbt/","summary":"\u003ch2 id=\"红黑树c\"\u003e红黑树(C++)\u003c/h2\u003e\n\u003ch3 id=\"红黑树性质\"\u003e红黑树性质\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e每个节点只能是红色或者黑色\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e根节点是黑色\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e叶子节点是黑色\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e红色节点的子节点必须是黑色\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e任一节点到其子树叶子节点的所有简单路径具有相同数量的黑色节点\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"插入\"\u003e插入\u003c/h3\u003e\n\u003cp\u003e共6种情况，其中33对称，实际上就3种\u003c/p\u003e\n\u003ch3 id=\"删除\"\u003e删除\u003c/h3\u003e\n\u003cp\u003e共8种情况，其中44对称，实际上就4种\u003c/p\u003e\n\u003ch3 id=\"代码实现\"\u003e代码实现\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-cpp\" data-lang=\"cpp\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;algorithm\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e#include\u003c/span\u003e \u003cspan class=\"cpf\"\u003e\u0026lt;iostream\u0026gt;\u003c/span\u003e\u003cspan class=\"cp\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"cp\"\u003e\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"n\"\u003estd\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eenum\u003c/span\u003e \u003cspan class=\"nc\"\u003eColor\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etemplate\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003etypename\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eNode\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eT\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eColor\u003c/span\u003e \u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eColor\u003c/span\u003e \u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enullptr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enullptr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enullptr\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003etemplate\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"k\"\u003etypename\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eRBT\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eprivate\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003epublic\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eRBT\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003einsert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003einsert_fixup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003einsert_fixup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ez\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003etransplant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ev\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eminimum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eu\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eu\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eu\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eremove\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eColor\u003c/span\u003e \u003cspan class=\"n\"\u003eorigin_y\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etransplant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003enil\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etransplant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eminimum\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eorigin_y\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003etransplant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etransplant\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ey\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ez\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eorigin_y\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eremove_fixup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evoid\u003c/span\u003e \u003cspan class=\"nf\"\u003eremove_fixup\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e!=\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"k\"\u003eelse\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e==\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eright\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eRED\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eleftRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003ew\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ew\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eleft\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003erightRotate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003eparent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003ex\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eroot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003ex\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ecolor\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBLACK\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// test for number 1-100\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"nf\"\u003emain\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eauto\u003c/span\u003e \u003cspan class=\"o\"\u003e*\u003c/span\u003e\u003cspan class=\"n\"\u003enodes\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eNode\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enodes\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e-\u0026gt;\u003c/span\u003e\u003cspan class=\"n\"\u003ekey\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"mi\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eRBT\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"o\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003einsert\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enodes\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003efor\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e \u003cspan class=\"o\"\u003e\u0026lt;\u003c/span\u003e \u003cspan class=\"mi\"\u003e95\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"o\"\u003e++\u003c/span\u003e\u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eT\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eremove\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enodes\u003c/span\u003e \u003cspan class=\"o\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003ei\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e","title":"红黑树(C++)"},{"content":"题龙阳县青草湖 [作者] 唐温如 [朝代] 元\n西风吹老洞庭波，一夜湘君白发多。\n醉后不知天在水，满船清梦压星河。\n无题 [出自] 风云\n倚楼听风雨,淡看江湖路.\n但见泪痕湿,不知心恨谁!\n春夜喜雨 [作者] 杜甫 [朝代] 唐\n好雨知时节，当春乃发生。\n随风潜入夜，润物细无声。\n野径云俱黑，江船火独明。\n晓看红湿处，花重锦官城。\n和董传留别 [作者] 苏轼 [朝代] 宋\n粗缯大布裹生涯，腹有诗书气自华。\n厌伴老儒烹瓠叶，强随举子踏槐花。\n囊空不办寻春马，眼乱行看择婿车。\n得意犹堪夸世俗，诏黄新湿字如鸦。\n大德歌·冬景 [作者] 关汉卿 [朝代] 元\n雪粉华，舞梨花，再不见烟村四五家。\n密洒堪图画，看疏林噪晚鸦。\n黄芦掩映清江下，斜缆着钓鱼艖。\n清平乐·春归何处 [作者] 黄庭坚 [朝代] 宋\n春归何处？寂寞无行路。\n若有人知春去处，唤取归来同住。\n春无踪迹谁知？除非问取黄鹂。\n百啭无人能解，因风飞过蔷薇。\n送别 长亭外 [作者] 李叔同\n长亭外 古道边 芳草碧连天，\n晚风拂柳笛声残 夕阳山外山，\n长亭外 古道边 芳草碧连天，\n晚风拂柳笛声残 夕阳山外山，\n天之涯 地之角 知交半零落，\n一壶浊酒尽余欢今宵别梦寒，\n长亭外 古道边 芳草碧连天，\n问君此去几时来 来时莫徘徊，\n天之涯 地之角 知交半零落，\n人生难得是欢聚 惟有别离多，\n天之涯 地之角 知交半零落，\n人生难得是欢聚 惟有别离多\n书河上亭壁 [作者] 寇准 [朝代] 宋\n岸阔樯稀波渺茫，独凭危槛思何长。\n萧萧远树疏林外，一半秋山带夕阳。\n画 [作者] 王维 [朝代] 唐\n远看山有色，近听水无声。\n春去花还在，人来鸟不惊。\n金缕衣 [作者] 佚名 [朝代] 唐\n劝君莫惜金缕衣，劝君惜取少年时。\n花开堪折直须折，莫待无花空折枝。\n明月 [作者] 天马的诗 [朝代] 现\n明月时隐时现，清风若即若离。 虚幻无常飘天际，云儿自游移。\n一切都会过去，何苦痴存记忆？ 听玉泉带走山情思，看薄雾悄抚大地。\n虫鸣依萦幽谷，偶闻夜莺歌啼。 星星且请将息去，让花香漾进梦里。\n枝叶轻轻婆娑，疏影静静摇曳。 一个山果掉水中，蛙声沉入塘底。\n水调歌头·平生太湖上 建炎庚戌题吴江\n[作者] 佚名 [朝代] 宋\n平生太湖上，短棹几经过。如今重到，何事愁与水云多？拟把匣中长剑，换取扁舟一叶，归去老渔蓑。银艾非吾事，丘壑已蹉跎。\n脍新鲈，斟美酒，起悲歌。太平生长，岂谓今日识干戈。欲泻三江雪浪，净洗胡尘千里，不用挽天河。回首望霄汉，双泪堕清波！\n西江月·夜行黄沙道中 [作者] 辛弃疾 [朝代] 宋\n明月别枝惊鹊，清风半夜鸣蝉。稻花香里说丰年，听取蛙声一片。\n七八个星天外，两三点雨山前。旧时茅店社林边，路转溪桥忽见。\n西岳云台歌送丹丘子 [作者] 李白 [朝代] 唐\n西岳峥嵘何壮哉！黄河如丝天际来。\n黄河万里触山动，盘涡毂转秦地雷。\n荣光休气纷五彩，千年一清圣人在。\n巨灵咆哮擘两山，洪波喷箭射东海。\n三峰却立如欲摧，翠崖丹谷高掌开。\n白帝金精运元气，石作莲花云作台。\n云台阁道连窈冥，中有不死丹丘生。\n明星玉女备洒扫，麻姑搔背指爪轻。\n我皇手把天地户，丹丘谈天与天语。\n九重出入生光辉，东来蓬莱复西归。\n玉浆倘惠故人饮，骑二茅龙上天飞。\n虞美人·愁痕满地无人省 [作者] 纳兰性德 [朝代] 清\n愁痕满地无人省，露湿琅玕影。闲阶小立倍荒凉。还剩旧时月色在潇湘。\n薄情转是多情累，曲曲柔肠碎。红笺向壁字模糊，忆共灯前呵手为伊书。\n清平乐·东风依旧 [作者] 刘弇 [朝代] 宋\n东风依旧，著意隋堤柳。搓得鹅儿黄欲就，天气清明时候。\n去年紫陌青门，今宵雨魄天魂。断送一生憔悴，能消几个黄昏！\n送杜十四之江南 / 送杜晃进士之东吴 [作者] 孟浩然 [朝代] 唐\n荆吴相接水为乡，君去春江正淼茫。\n日暮征帆何处泊，天涯一望断人肠。\n夜宿山寺 [作者] 李白 [朝代] 唐\n危楼高百尺，手可摘星辰。\n不敢高声语，恐惊天上人。\n定风波·重阳 [作者] 苏轼 [朝代] 宋\n与客携壶上翠微，江涵秋影雁初飞，尘世难逢开口笑，年少，菊花须插满头归。\n酩酊但酬佳节了，云峤，登临不用怨斜晖。古往今来谁不老，多少，牛山何必更沾衣。\n生年不满百 [作者] 佚名 [朝代] 两汉\n生年不满百，常怀千岁忧。\n昼短苦夜长，何不秉烛游！\n为乐当及时，何能待来兹？\n愚者爱惜费，但为后世嗤。\n仙人王子乔，难可与等期。\n贞元十四年旱甚见权门移芍药花 [作者] 吕温 [朝代] 宋\n绿原青垄渐成尘，汲井开园日日新。\n四月带花移芍药，不知忧国是何人。\n于长安归还扬州九月九日行薇山亭赋韵 / 长安九日诗 [作者] 江总 [南北朝] 南北朝\n心逐南云逝，形随北雁来。\n故乡篱下菊，今日几花开。\n菊花 [作者] 唐寅 [朝代] 明代\n故园三径吐幽丛，一夜玄霜坠碧空。\n多少天涯未归客，尽借篱落看秋风。\n题长安壁主人 [作者] 张谓 [朝代] 唐代\n世人结交须黄金，黄金不多交不深。\n纵令然诺暂相许，终是悠悠行路心。\n题元丹丘山居 [作者] 李白 [朝代] 唐代\n故人栖东山，自爱丘壑美。\n青春卧空林，白日犹不起。\n松风清襟袖，石潭洗心耳。\n羡君无纷喧，高枕碧霞里。\n生年不满百 [作者] 佚名 [朝代] 两汉\n生年不满百，常怀千岁忧。\n昼短苦夜长，何不秉烛游！\n为乐当及时，何能待来兹？\n愚者爱惜费，但为后世嗤。\n仙人王子乔，难可与等期。\n寒食寄京师诸弟 [作者] 韦应物 [朝代] 唐\n雨中禁火空斋冷，江上流莺独坐听。\n把酒看花想诸弟，杜陵寒食草青青。\n江城子·前瞻马耳九仙山 [作者] 苏轼 [朝代] 宋\n前瞻马耳九仙山。碧连天。晚云间。城上高台，真个是超然。莫使匆匆云雨散，今夜里，月婵娟。\n小溪鸥鹭静联拳。去翩翩。点轻烟。人事凄凉，回首便他年。莫忘使君歌笑处，垂柳下，矮槐前。\n谢亭送别 [作者] 许浑 [朝代] 唐\n劳歌一曲解行舟，红叶青山水急流。\n日暮酒醒人已远，满天风雨下西楼。\n春夜别友人二首·其一 [朝代] 唐 [作者] 陈子昂\n银烛吐青烟，金樽对绮筵。\n离堂思琴瑟，别路绕山川。\n明月隐高树，长河没晓天。\n悠悠洛阳道，此会在何年。\n小池 [朝代] 宋 [作者] 杨万里\n泉眼无声惜细流，树阴照水爱晴柔。\n小荷才露尖尖角，早有蜻蜓立上头。\n生查子·富阳道中 [朝代] 宋 [作者] 毛滂\n春晚出小城，落日行江岸。人不共潮来，香亦临风散。\n花谢小妆残，莺困清歌断。行雨梦魂消，飞絮心情乱。\n卖花翁 [朝代] 唐 [作者] 吴融\n和烟和露一丛花，担入宫城许史家。\n惆怅东风无处说，不教闲地著春华。\n西江月·世事一场大梦 [朝代] 宋 [作者] 苏轼\n世事一场大梦，人生几度秋凉？夜来风叶已鸣廊。看取眉头鬓上。\n酒贱常愁客少，月明多被云妨。中秋谁与共孤光。把盏凄然北望。\n临江仙·滚滚长江东逝水 [朝代] 元 [作者] 杨慎\n滚滚长江东逝水，浪花淘尽英雄。是非成败转头空。青山依旧在，几度夕阳红。\n白发鱼樵江渚上，贯看秋风春月。一壶浊酒喜相逢。古今多少事，都付笑谈中。\n木兰词 [朝代] 清 [作者] 纳兰性德\n人生若只如初见，何事秋风悲画扇。\n等闲变却故人心，却道故心人易变。\n骊山语罢清宵半，泪雨霖铃终不怨。\n何如薄幸锦衣郎，比翼连枝当日愿。\n定风波 [朝代] 宋 [作者] 苏轼\n莫听穿林打叶声，何妨吟啸且徐行。\n竹杖芒鞋轻胜马，谁怕？一蓑烟雨任平生。\n料峭春风吹酒醒，微冷，山头斜照却相迎。\n回首向来萧瑟处，归去，也无风雨也无晴。\n贺新郎·甚矣吾衰矣 [朝代] 宋 [作者] 辛弃疾\n邑中园亭，仆皆为赋此词。一日，独坐停云，水声山色，竞来相娱。意溪山欲援例者，遂作数语，庶几仿佛渊明思亲友之意云。\n甚矣吾衰矣。怅平生、交游零落，只今余几！白发空垂三千丈，一笑人间万事。问何物、能令公喜？我见青山多妩媚，料青山见我应如是。情与貌，略相似。\n一尊搔首东窗里。想渊明、停云诗就，此时风味。江左沉酣求名者，岂识浊醪妙理。回首叫、云飞风起。不恨古人吾不见，恨古人、不见吾狂耳。知我者，二三子。\n我见众生皆草木，唯你是青山 [出自] 大乘玄论\n杂感 [朝代] 清 [作者] 黄景仁\n仙佛茫茫两未成，只知独夜不平鸣。\n风蓬飘尽悲歌气，泥絮沾来薄幸名。\n十有九人堪白眼，百无一用是书生。\n莫因诗卷愁成谶，春鸟秋虫自作声。\n小岁日喜谈氏外孙女孩满月 [朝代] 唐 [作者] 白居易\n今旦夫妻喜，他人岂得知。自嗟生女晚，敢讶见孙迟。\n物以稀为贵，情因老更慈。新年逢吉日，满月乞名时。\n桂燎熏花果，兰汤洗玉肌。怀中有可抱，何必是男儿。\n花月痕 · 第十五回诗 [朝代] 清 [作者] 魏秀仁\n多情自古空余恨，好梦由来最易醒。\n岂是拈花难解脱，可怜飞絮太飘零。\n香巢乍结鸳鸯社，新句犹书翡翠屏。\n不为别离肠已断，泪痕也满旧衫青。\n蝶恋花·槛菊愁烟兰泣露 [朝代] 宋 [作者] 晏殊\n槛菊愁烟兰泣露，罗幕轻寒，燕子双飞去。明月不谙离恨苦，斜光到晓穿朱户。\n昨夜西风凋碧树，独上高楼，望尽天涯路。欲寄彩笺兼尺素，山长水阔知何处？\n相见欢·林花谢了春红 [朝代] 五代 [作者] 李煜\n林花谢了春红，太匆匆。无奈朝来寒雨晚来风。\n胭脂泪，相留醉，几时重。自是人生长恨水长东。\n雨霖铃·寒蝉凄切 [朝代] 宋 [作者] 柳永\n寒蝉凄切，对长亭晚，骤雨初歇。\n都门帐饮无绪，留恋处，兰舟催发。\n执手相看泪眼，竟无语凝噎。\n念去去，千里烟波，暮霭沉沉楚天阔。\n多情自古伤离别，更那堪，冷落清秋节！\n今宵酒醒何处？杨柳岸，晓风残月。\n此去经年，应是良辰好景虚设。\n便纵有千种风情，更与何人说？\n临江仙·寒柳 [朝代] 清 [作者] 纳兰容若\n飞絮飞花何处是，层冰积雪摧残，疏疏一树五更寒。爱他明月好，憔悴也相关。\n最是繁丝摇落后，转教人忆春山。湔裙梦断续应难。西风多少恨，吹不散眉弯。\n","permalink":"https://rmtt.github.io/zh/posts/gushici/gushici-01/","summary":"\u003ch4 id=\"题龙阳县青草湖\"\u003e题龙阳县青草湖\u003c/h4\u003e\n\u003cp\u003e[作者] 唐温如  [朝代] 元\u003c/p\u003e\n\u003cp\u003e西风吹老洞庭波，一夜湘君白发多。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e醉后不知天在水，满船清梦压星河。\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"无题\"\u003e无题\u003c/h4\u003e\n\u003cp\u003e[出自] 风云\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e倚楼听风雨,淡看江湖路.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e但见泪痕湿,不知心恨谁!\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"春夜喜雨\"\u003e春夜喜雨\u003c/h4\u003e\n\u003cp\u003e[作者] 杜甫 [朝代] 唐\u003c/p\u003e\n\u003cp\u003e好雨知时节，当春乃发生。\u003c/p\u003e\n\u003cp\u003e随风潜入夜，润物细无声。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e野径云俱黑，江船火独明。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e晓看红湿处，花重锦官城。\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"和董传留别\"\u003e和董传留别\u003c/h4\u003e\n\u003cp\u003e[作者] 苏轼 [朝代] 宋\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e粗缯大布裹生涯，腹有诗书气自华。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e厌伴老儒烹瓠叶，强随举子踏槐花。\u003c/p\u003e\n\u003cp\u003e囊空不办寻春马，眼乱行看择婿车。\u003c/p\u003e\n\u003cp\u003e得意犹堪夸世俗，诏黄新湿字如鸦。\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"大德歌冬景\"\u003e大德歌·冬景\u003c/h4\u003e\n\u003cp\u003e[作者] 关汉卿 [朝代] 元\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e雪粉华，舞梨花，再不见烟村四五家。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e密洒堪图画，看疏林噪晚鸦。\u003c/p\u003e\n\u003cp\u003e黄芦掩映清江下，斜缆着钓鱼艖。\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"清平乐春归何处\"\u003e清平乐·春归何处\u003c/h4\u003e\n\u003cp\u003e[作者] 黄庭坚 [朝代] 宋\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e春归何处？寂寞无行路。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e若有人知春去处，唤取归来同住。\u003c/p\u003e\n\u003cp\u003e春无踪迹谁知？除非问取黄鹂。\u003c/p\u003e\n\u003cp\u003e百啭无人能解，因风飞过蔷薇。\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"送别-长亭外\"\u003e送别 长亭外\u003c/h4\u003e\n\u003cp\u003e[作者] \u003ca href=\"https://baike.baidu.com/item/%E6%9D%8E%E5%8F%94%E5%90%8C/175159\"\u003e李叔同\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e长亭外 古道边 芳草碧连天\u003c/strong\u003e，\u003c/p\u003e\n\u003cp\u003e晚风拂柳笛声残 夕阳山外山，\u003c/p\u003e\n\u003cp\u003e长亭外 古道边 芳草碧连天，\u003c/p\u003e\n\u003cp\u003e晚风拂柳笛声残 夕阳山外山，\u003c/p\u003e\n\u003cp\u003e天之涯 地之角 知交半零落，\u003c/p\u003e\n\u003cp\u003e一壶浊酒尽余欢今宵别梦寒，\u003c/p\u003e\n\u003cp\u003e长亭外 古道边 芳草碧连天，\u003c/p\u003e\n\u003cp\u003e问君此去几时来 来时莫徘徊，\u003c/p\u003e\n\u003cp\u003e天之涯 地之角 知交半零落，\u003c/p\u003e\n\u003cp\u003e人生难得是欢聚 惟有别离多，\u003c/p\u003e\n\u003cp\u003e天之涯 地之角 知交半零落，\u003c/p\u003e","title":"古诗词日常收藏"},{"content":"为什么要Windows + Linux 其实主要是因为N卡和CUDA，不然直接macOS就行了 (x)\n探索经历 Arch + i3wm + kvm 众所周知，Arch是最好的发行版(x)，配上i3wm的便捷操作，效率确实能提高不少，但是最终还是放弃了这个方案。放弃的原因并不是因为软件的问题，主要还是因为硬件的问题，一是主板不支持vt-d，不能直通显卡给KVM，而windows和macOS都是比较吃显卡的，二是新换的Intel AX200在Linux固件上还有点问题，不过这个问题是personally。\nWindows10 + Hyper-v 最终还是选择了这个方案，主要是因为Linux可以不吃显卡，有图形化的需求可以直接在Windows上跑一个X Server。\nHyper-v安装Arch 安装过程都是傻瓜式的，因为我笔记本上刚好有两块SSD，索性就直接把Arch装在256G的PM961上了，然后Switch用的就是默认的Switch。\nArch安装Hyper-v Integration Service 微软提供了一套服务来让宿主机和Hyper-v VM交互，包括文件传输、状态监控、获取IP等等，只需要安装hyperv这个包就行了，然后开启如下三个daemon:\nhv_kvp_daemon hv_vss_daemon hv_fcopy_daemon 不过启动这3个service后再重启VM，马上就会发现问题：这3个Service启动时有很大的可能会失败。然后看了一下Service的内容:\n[Unit] xxx ConditionPathExists=/dev/vmbus/hv_xxx 失败的原因是ConditionPathExists不满足，但是奇怪的是重启登录后这个设备是存在的，手动启动是可以成功的，于是开始Google(期间因为网络问题错过了标准答案，还好后来archlinuxcn群里有人帮忙找到了答案)。在Redhat的论坛里有一篇15年的帖子讨论 了这个问题，然后我看了一下日志发现现在2020年了，hyper-v的这个设计还是一样毫无变化。主要的原因就是hyper-v的这个vmbus是通过netlink挂载上去的，而网络传输是存在延迟的，所以就会导致在Integration Service启动的时候vmbus还没有挂载上，不过解决的办法也很简单，就是自己添加一个udev的rule，在vmbus成功挂载时再次启动相应的service：\nSUBSYSTEM==\u0026#34;misc\u0026#34;,KERNEL==\u0026#34;vmbus/hv_kvp\u0026#34;,TAG+=\u0026#34;systemd\u0026#34;,ENV{SYSTEMD_WANTS}+=\u0026#34;hv_kvp_daemon.service\u0026#34; 那么Integration Service启动失败的问题就差不多解决了(期间因为把==写成了=，找了好几个小时 TwT)。\nWindows Terminal的配置 Windows Terminal是微软官方发布的一款terminator，目前还在preview，不过已经0.9了，估计可能20H1就要发布正式版了。\n第一步当然是要先换字体和配色，字体很简单，用fontFace配置就行了，然后配色，刚好自带了Solarized(目前最喜欢的配色)，不过如果是Powershell最好换用其他颜色，因为PS的语法亮尚会和Solarized冲突。(感谢这些愿意无私奉献的艺术家们)\n接下来就是配置ssh登录Arch，因为Default Switch的IP range是dynamic的(为什么不用Static IP?因为之前试过几次都不稳定，不是突然变了就是突然连不了Internet了)，所以需要动态获取Arch的IP，好在Powershell提供了很多操作命令，实现起来很简单：\nfunction arch_addr { $addr = (Get-VMNetworkAdapter Arch).ipaddresses[0] return $addr } 同时为了支持转发X，需要配置端口转发，因为Windows Terminal中直连貌似不行，完整的代码如下：\n$arch_switch=\u0026#34;Default Switch\u0026#34; function arch_addr { $addr = (Get-VMNetworkAdapter Arch).ipaddresses[0] return $addr } function arch_switch_addr { return (Get-NetIPAddress | Where-Object {$_.InterfaceAlias -like \u0026#34;*($arch_switch)*\u0026#34; -and $_.AddressFamily -eq \u0026#34;IPv4\u0026#34;}).ipaddress } function arch { $addr = arch_addr $switch_addr = arch_switch_addr $x_port = 6000 ssh -R $switch_addr`:$x_port`:localhost`:$x_port mt@$addr -i C:\\Users\\RMT\\.ssh\\arch } 同时需要手动在Arch中设置DISPLAY，然后就可以转发X了，Windows10用的是VCXSRV。\n共享文件夹 共享文件夹直接使用CIFS就行了，首先安装cifs-utils，然后在Windows10中配置一个共享文件夹，然后直接挂载即可，不过要注意在Arch中登录Windows10时，使用的是你微软账户的密码而不是本地的PIN。\nmount -t cifs //PC/share /mnt/Hyper-V -o credentials=~/.credentials,ip=xxx 在hosts中自动更新Arch的IP 因为Arch的IP是动态的，如果想在CLION等工具是使用Arch上的toolchain，那每次都要更改一次设置还是挺麻烦的，索性就用脚本在每次开机的时候自动更新hosts，把Arch的ip加进去：\n$arch_switch=\u0026#34;Default Switch\u0026#34; function arch_addr { $addr = (Get-VMNetworkAdapter Arch).ipaddresses[0] return $addr } $path_hosts = \u0026#34;C:\\\\Windows\\\\System32\\\\drivers\\\\etc\\\\hosts\u0026#34; $host_content = Get-Content -Path $path_hosts $arch_host_name = \u0026#34;Arch\u0026#34; $arch_addr = arch_addr $flag = 0 $line = 0 foreach($msg in $host_content){ if ($msg -like \u0026#34;*$arch_host_name*\u0026#34;){ $flag = 1 break } $line++ } if($flag -eq 1){ $host_content[$line] = \u0026#34;$arch_addr Arch\u0026#34; Out-File -FilePath $path_hosts -Encoding ASCII -InputObject $host_content }else { Out-File -FilePath $path_hosts -Append -Encoding ASCII -InputObject \u0026#34;$arch_addr Arch\u0026#34; } ipconfig.exe /flushdns 之后就可以在任何地方直接用Arch来代替ip 了。\n在Arch中获取Windows的IP 因为Default Switch用的是NAT，所以可以直接用ip n查看Default Switch的ip，通过这个ip便可以访问Windows宿主机，比如使用宿主机中的代理：\nwin_addr=$(ip n | awk \u0026#39;{print $1}\u0026#39;) export http_proxy=\u0026#34;http://$win_addr:port\u0026#34; 总结 看了下Hyper-v的交互性其实挺强的，还有很多可以扩展的空间，感觉完全可以手动实现一个WSL?比如如果想在Windows10上直接启动Arch里面的App，可以自己写一个powershell脚本:\nssh -X -R xxx:xxx:xx:xx xx@xx \u0026#34;code\u0026#34; 然后新建一个快捷方式，执行命令powershell xx.ps1\n然后就是在Arch中调用Windows10的程序，之前看了一下X410这个东西，Hyper-v可以和Windows宿主机建立一个VSOCK，那么两边分别运行一个监听程序，来处理相互的调用感觉是可行，等有时间了可以试试。\n","permalink":"https://rmtt.github.io/zh/posts/windows-environment/","summary":"\u003ch2 id=\"为什么要windows--linux\"\u003e为什么要Windows + Linux\u003c/h2\u003e\n\u003cp\u003e其实主要是因为N卡和CUDA，不然直接macOS就行了 (x)\u003c/p\u003e\n\u003ch2 id=\"探索经历\"\u003e探索经历\u003c/h2\u003e\n\u003ch3 id=\"arch--i3wm--kvm\"\u003eArch + i3wm + kvm\u003c/h3\u003e\n\u003cp\u003e众所周知，Arch是最好的发行版(x)，配上i3wm的便捷操作，效率确实能提高不少，但是最终还是放弃了这个方案。放弃的原因并不是因为软件的问题，主要还是因为硬件的问题，一是主板不支持vt-d，不能直通显卡给KVM，而windows和macOS都是比较吃显卡的，二是新换的Intel AX200在Linux固件上还有点问题，不过这个问题是personally。\u003c/p\u003e\n\u003ch3 id=\"windows10--hyper-v\"\u003eWindows10 + Hyper-v\u003c/h3\u003e\n\u003cp\u003e最终还是选择了这个方案，主要是因为Linux可以不吃显卡，有图形化的需求可以直接在Windows上跑一个X Server。\u003c/p\u003e\n\u003ch4 id=\"hyper-v安装arch\"\u003eHyper-v安装Arch\u003c/h4\u003e\n\u003cp\u003e安装过程都是傻瓜式的，因为我笔记本上刚好有两块SSD，索性就直接把Arch装在256G的PM961上了，然后Switch用的就是默认的Switch。\u003c/p\u003e\n\u003ch4 id=\"arch安装hyper-v-integration-service\"\u003eArch安装Hyper-v Integration Service\u003c/h4\u003e\n\u003cp\u003e微软提供了一套服务来让宿主机和Hyper-v VM交互，包括文件传输、状态监控、获取IP等等，只需要安装\u003ccode\u003ehyperv\u003c/code\u003e这个包就行了，然后开启如下三个daemon:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ehv_kvp_daemon\u003c/li\u003e\n\u003cli\u003ehv_vss_daemon\u003c/li\u003e\n\u003cli\u003ehv_fcopy_daemon\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e不过启动这3个service后再重启VM，马上就会发现问题：这3个Service启动时有很大的可能会失败。然后看了一下Service的内容:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"o\"\u003e[\u003c/span\u003eUnit\u003cspan class=\"o\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003exxx\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eConditionPathExists\u003c/span\u003e\u003cspan class=\"o\"\u003e=\u003c/span\u003e/dev/vmbus/hv_xxx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e失败的原因是ConditionPathExists不满足，但是奇怪的是重启登录后这个设备是存在的，手动启动是可以成功的，于是开始Google(期间因为网络问题错过了标准答案，还好后来archlinuxcn群里有人帮忙找到了答案)。在Redhat的论坛里有一篇15年的\u003ca href=\"https://bugzilla.redhat.com/show_bug.cgi?id=1195029\"\u003e帖子\u003c/a\u003e讨论 了这个问题，然后我看了一下日志发现现在2020年了，hyper-v的这个设计还是一样毫无变化。主要的原因就是hyper-v的这个vmbus是通过netlink挂载上去的，而网络传输是存在延迟的，所以就会导致在Integration Service启动的时候vmbus还没有挂载上，不过解决的办法也很简单，就是自己添加一个udev的rule，在vmbus成功挂载时再次启动相应的service：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003eSUBSYSTEM\u003c/span\u003e\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;misc\u0026#34;\u003c/span\u003e,KERNEL\u003cspan class=\"o\"\u003e==\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;vmbus/hv_kvp\u0026#34;\u003c/span\u003e,TAG+\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;systemd\u0026#34;\u003c/span\u003e,ENV\u003cspan class=\"o\"\u003e{\u003c/span\u003eSYSTEMD_WANTS\u003cspan class=\"o\"\u003e}\u003c/span\u003e+\u003cspan class=\"o\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;hv_kvp_daemon.service\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e那么Integration Service启动失败的问题就差不多解决了(期间因为把\u003ccode\u003e==\u003c/code\u003e写成了\u003ccode\u003e=\u003c/code\u003e，找了好几个小时 TwT)。\u003c/p\u003e\n\u003ch4 id=\"windows-terminal的配置\"\u003eWindows Terminal的配置\u003c/h4\u003e\n\u003cp\u003eWindows Terminal是微软官方发布的一款terminator，目前还在preview，不过已经0.9了，估计可能20H1就要发布正式版了。\u003c/p\u003e\n\u003cp\u003e第一步当然是要先换字体和配色，字体很简单，用\u003ccode\u003efontFace\u003c/code\u003e配置就行了，然后配色，刚好自带了\u003ca href=\"https://ethanschoonover.com/solarized/\"\u003eSolarized\u003c/a\u003e(目前最喜欢的配色)，不过如果是Powershell最好换用其他颜色，因为PS的语法亮尚会和Solarized冲突。(感谢这些愿意无私奉献的艺术家们)\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"Solarized\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/windows-environment/solarized-yinyang.png\"\u003e\u003c/p\u003e\n\u003cp\u003e接下来就是配置ssh登录Arch，因为Default Switch的IP range是dynamic的(为什么不用Static IP?因为之前试过几次都不稳定，不是突然变了就是突然连不了Internet了)，所以需要动态获取Arch的IP，好在Powershell提供了很多操作命令，实现起来很简单：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003earch_addr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-VMNetworkAdapter\u003c/span\u003e \u003cspan class=\"n\"\u003eArch\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eipaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e同时为了支持转发X，需要配置端口转发，因为Windows Terminal中直连貌似不行，完整的代码如下：\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-powershell\" data-lang=\"powershell\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nv\"\u003e$arch_switch\u003c/span\u003e\u003cspan class=\"p\"\u003e=\u003c/span\u003e\u003cspan class=\"s2\"\u003e\u0026#34;Default Switch\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003earch_addr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-VMNetworkAdapter\u003c/span\u003e \u003cspan class=\"n\"\u003eArch\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eipaddresses\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mf\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"nb\"\u003earch_switch_addr\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nb\"\u003eGet-NetIPAddress\u003c/span\u003e \u003cspan class=\"p\"\u003e|\u003c/span\u003e \u003cspan class=\"nb\"\u003eWhere-Object\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eInterfaceAlias\u003c/span\u003e \u003cspan class=\"o\"\u003e-like\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;*(\u003c/span\u003e\u003cspan class=\"nv\"\u003e$arch_switch\u003c/span\u003e\u003cspan class=\"s2\"\u003e)*\u0026#34;\u003c/span\u003e \u003cspan class=\"o\"\u003e-and\u003c/span\u003e \u003cspan class=\"nv\"\u003e$_\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"py\"\u003eAddressFamily\u003c/span\u003e \u003cspan class=\"o\"\u003e-eq\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;IPv4\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e}).\u003c/span\u003e\u003cspan class=\"py\"\u003eipaddress\u003c/span\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003efunction\u003c/span\u003e\u003cspan class=\"w\"\u003e    \u003c/span\u003e\u003cspan class=\"nb\"\u003earch\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003earch_addr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$switch_addr\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003earch_switch_addr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nv\"\u003e$x_port\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"mf\"\u003e6000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003essh\u003c/span\u003e \u003cspan class=\"n\"\u003e-R\u003c/span\u003e \u003cspan class=\"nv\"\u003e$switch_addr\u003c/span\u003e\u003cspan class=\"p\"\u003e`\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"nv\"\u003e$x_port\u003c/span\u003e\u003cspan class=\"p\"\u003e`\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"n\"\u003elocalhost\u003c/span\u003e\u003cspan class=\"p\"\u003e`\u003c/span\u003e\u003cspan class=\"err\"\u003e:\u003c/span\u003e\u003cspan class=\"nv\"\u003e$x_port\u003c/span\u003e  \u003cspan class=\"n\"\u003emt\u003c/span\u003e\u003cspan class=\"p\"\u003e@\u003c/span\u003e\u003cspan class=\"nv\"\u003e$addr\u003c/span\u003e \u003cspan class=\"n\"\u003e-i\u003c/span\u003e \u003cspan class=\"n\"\u003eC:\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eUsers\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003eRMT\u003c/span\u003e\u003cspan class=\"p\"\u003e\\.\u003c/span\u003e\u003cspan class=\"n\"\u003essh\u003c/span\u003e\u003cspan class=\"p\"\u003e\\\u003c/span\u003e\u003cspan class=\"n\"\u003earch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e同时需要手动在Arch中设置\u003ccode\u003eDISPLAY\u003c/code\u003e，然后就可以转发X了，Windows10用的是VCXSRV。\u003c/p\u003e","title":"Windows10 + Linux开发环境探索"},{"content":"虽然知道了有理数集是可数的，但一直都不知道该如何定义一个有理数序列，使得每个有理数都在其中出现至少一次。今天看书的时候了解到了一种构造方法，所以记录一下。\n有理数的可数性证明 众所周知，有理数都可以写成$ \\frac{p}{q} $的形式，其中p和q都是自然数。对于一个大于1的正整数x，将x表示为$x=p + q$共有$x-1$种表示 方式。对于所有的$x=2,3,4,\\dots$，我们将p和q构造成分数$\\frac{p}{q}$，并按照p从小到大排列，则可以得到如下序列(忽略p和q有大于1的公因数的情况)：\n$$\\frac{1}{1},\\frac{1}{2},\\frac{2}{1},\\frac{3}{1},\\frac{1}{3},\\frac{1}{4},\\frac{2}{3},\\frac{3}{2},\\frac{4}{1},\\frac{1}{5},\\frac{5}{1},\\frac{1}{6},\\frac{2}{5}\\dots$$或许从这里还看不出这个序列已经包含了所有大于0的有理数，那么可以看如下的规律：\n对于$p=1,2,3,4,\\dots$，其分母都包括了所有的自然数。对于负有理数，vice versa.\n","permalink":"https://rmtt.github.io/zh/posts/rational-number-denumerable/","summary":"\u003cp\u003e虽然知道了有理数集是可数的，但一直都不知道该如何定义一个有理数序列，使得每个有理数都在其中出现至少一次。今天看书的时候了解到了一种构造方法，所以记录一下。\u003c/p\u003e\n\u003ch3 id=\"有理数的可数性证明\"\u003e有理数的可数性证明\u003c/h3\u003e\n\u003cp\u003e众所周知，有理数都可以写成$ \\frac{p}{q} $的形式，其中p和q都是自然数。对于一个大于1的正整数x，将x表示为$x=p + q$共有$x-1$种表示 方式。对于所有的$x=2,3,4,\\dots$，我们将p和q构造成分数$\\frac{p}{q}$，并按照p从小到大排列，则可以得到如下序列(忽略p和q有大于1的公因数的情况)：\u003c/p\u003e\n$$\\frac{1}{1},\\frac{1}{2},\\frac{2}{1},\\frac{3}{1},\\frac{1}{3},\\frac{1}{4},\\frac{2}{3},\\frac{3}{2},\\frac{4}{1},\\frac{1}{5},\\frac{5}{1},\\frac{1}{6},\\frac{2}{5}\\dots$$\u003cp\u003e或许从这里还看不出这个序列已经包含了所有大于0的有理数，那么可以看如下的规律：\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"正有理数的可数性\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/rational-number-denumerable/1.png\"\u003e\u003c/p\u003e\n\u003cp\u003e对于$p=1,2,3,4,\\dots$，其分母都包括了所有的自然数。对于负有理数，vice versa.\u003c/p\u003e","title":"有理数的可数性"},{"content":" 因为最近要写一篇GPU方面的论文，所以找了一些资料慢慢看\n参考：GPU Technology Trends and Future Requirements\n虽然是多年前的文章，不过讲得很细～\nGPU的发展 GPU的基本功能是处理图形，从最初单一的pipeline发展到现在，已经能够完成很多通用的计算任务，而且拥有远超CPU的并行计算能力。\nGPU基本知识 GPU接受的数据应该是一系列的Vertex(保存坐标信息)和Attributes(保存颜色、亮度等信息)，Vertex由专门的vertex shader处理，Attribute由pixel shader处理，shader就是GPU中的一个子程序。经过一系列的shaer处理后，最初的几何数据便会成功最终的像素合并到Frame Buffer中。\nGPU基础架构 从架构图可以比较容易看出，基本的工作方式就是通过BUS传输数据，然后GPU中一些shader讲计算任务分发给各个TPC。至于其中各个组件的作用，见下面的MindMap。\n","permalink":"https://rmtt.github.io/zh/posts/gpu-basic/","summary":"\u003cblockquote\u003e\n\u003cp\u003e因为最近要写一篇GPU方面的论文，所以找了一些资料慢慢看\u003c/p\u003e\n\u003cp\u003e参考：\u003ca href=\"https://ieeexplore.ieee.org/abstract/document/5424433/\"\u003eGPU Technology Trends and Future Requirements\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e虽然是多年前的文章，不过讲得很细～\u003c/p\u003e\u003c/blockquote\u003e\n\u003ch2 id=\"gpu的发展\"\u003eGPU的发展\u003c/h2\u003e\n\u003cp\u003eGPU的基本功能是处理图形，从最初单一的pipeline发展到现在，已经能够完成很多通用的计算任务，而且拥有远超CPU的并行计算能力。\u003c/p\u003e\n\u003ch2 id=\"gpu基本知识\"\u003eGPU基本知识\u003c/h2\u003e\n\u003cp\u003eGPU接受的数据应该是一系列的Vertex(保存坐标信息)和Attributes(保存颜色、亮度等信息)，Vertex由专门的vertex shader处理，Attribute由pixel shader处理，shader就是GPU中的一个子程序。经过一系列的shaer处理后，最初的几何数据便会成功最终的像素合并到Frame Buffer中。\u003c/p\u003e\n\u003ch2 id=\"gpu基础架构\"\u003eGPU基础架构\u003c/h2\u003e\n\u003cp\u003e\u003cimg alt=\"GPU基础架构\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/gpu-basic/architecture.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003e从架构图可以比较容易看出，基本的工作方式就是通过BUS传输数据，然后GPU中一些shader讲计算任务分发给各个TPC。至于其中各个组件的作用，见下面的MindMap。\u003c/p\u003e\n\u003cp\u003e\u003cimg alt=\"MindMap\" loading=\"lazy\" src=\"https://blog-img.rmtt.fun/posts/gpu-basic/mindmap.png\"\u003e\u003c/p\u003e","title":"GPU 基础知识"}]