<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>arys 的博客</title>
        <link>http://arys.top/</link>
        <description>计科学习日常~</description>
        <lastBuildDate>Sun, 24 May 2026 02:47:03 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en-US</language>
        <copyright>All rights reserved 2026, Qiyue Zhang</copyright>
        <item>
            <title><![CDATA[软件分析—期末笔记]]></title>
            <link>http://arys.top/article/sa-final</link>
            <guid>http://arys.top/article/sa-final</guid>
            <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[本文为课程的期末复习笔记，包括程序的表示、三种数据流分析，以及指针分析。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d280fa9253ffd68e53ef3f"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d2805abf9dda5c3f3612bc"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🗒️">🗒️</span></div><div class="notion-callout-text"><div class="notion-text notion-block-35fa9ed6f2d28084bd2bfa7defa2c82d">这是南京大学 <span class="notion-yellow"><a class="notion-link" href="https://tai-e.pascal-lab.net/lectures.html" target="_blank" rel="noopener noreferrer">软件分析</a></span> 的期末复习笔记，总结了笔者认为期末可能会涉及的内容。详细版笔记强烈建议参考 <a class="notion-link" href="https://fla.cuijiacai.com/" target="_blank" rel="noopener noreferrer">助教笔记</a>，内容十分全面。</div></div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281bfa720e33fd65766b8" data-id="35fa9ed6f2d281bfa720e33fd65766b8"><span><div id="35fa9ed6f2d281bfa720e33fd65766b8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281bfa720e33fd65766b8" title="第一部分：程序的表示"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">第一部分：程序的表示</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281e592d0c51ded6e3ca0" data-id="35fa9ed6f2d281e592d0c51ded6e3ca0"><span><div id="35fa9ed6f2d281e592d0c51ded6e3ca0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281e592d0c51ded6e3ca0" title="概述"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">概述</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281899fbee300d06bc906">Soundness 和 Completeness</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e7be7ee3ab37cca6fa"><li>完全性（Soundness）：只要是真的，都可以由 S 给出</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817b9868dd3104f36e24"><li>正确性（Completeness）：S 给出的都是真的</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817b9868dd3104f36e24"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280348cb9e86cf2b12d63"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A91e5eb16-851b-47b8-9393-90ca20d0425e%3Aimage-20251227140550667.png?table=block&amp;id=35fa9ed6-f2d2-8034-8cb9-e86cf2b12d63&amp;t=35fa9ed6-f2d2-8034-8cb9-e86cf2b12d63" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><div class="notion-text notion-block-35fa9ed6f2d2819eaa89e96a0d1a57b8">sound 的静态分析居多，即宁误报不漏报。</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28129b421e90889956674"><li>Sound 静态分析：over approximate (false positive)</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281079aa7c1b641435f70"><li>Complete 静态分析：under approximate (false negative)</li></ul><div class="notion-text notion-block-35fa9ed6f2d281128338e5bd8c9ad6b3">静态分析就是：抽象和过近似</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28139897dcc2d84ca4a2c"><li>对程序的具体值和抽象值建立映射，此函数为<b>状态函数</b>（State function）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281568988fdfb6ec6b9de"><li>针对抽象值进行运算（解析）（Evaluate）的函数为<b>转移函数</b>（Transfer function）</li></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28110b1bbdf65003750cc" data-id="35fa9ed6f2d28110b1bbdf65003750cc"><span><div id="35fa9ed6f2d28110b1bbdf65003750cc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28110b1bbdf65003750cc" title="程序的中间表示"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">程序的中间表示</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281f192dfcf7dc8d29d7c">三地址码（Three-address code, TAC）：一种 IR，每条指令最多有三个地址</div><div class="notion-text notion-block-35fa9ed6f2d281108ad9eef37c000cb4">控制流图（Control Flow Graph, CFG）：由 Basic Block 组成，BB 指的是只能从首指令进入，从尾指令流出的最长指令序列</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2813db90cd84ac954a60c"><li>入口语句包括：</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2813db90cd84ac954a60c"><li>程序第一条语句</li><li>跳转的目标语句</li><li>条件跳转的下一条语句</li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28122905bcf485088df3f"><li>BB：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d28121ad3cc67f8f072089" data-id="35fa9ed6f2d28121ad3cc67f8f072089"><span><div id="35fa9ed6f2d28121ad3cc67f8f072089" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28121ad3cc67f8f072089" title="第二部分：数据流分析及其应用"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">第二部分：数据流分析及其应用</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281738129fdcf1de2357d" data-id="35fa9ed6f2d281738129fdcf1de2357d"><span><div id="35fa9ed6f2d281738129fdcf1de2357d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281738129fdcf1de2357d" title="Reaching-Definitions"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Reaching-Definitions</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281c5af77e66d00b15ec6">过近似、正向分析</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f0ae59c7484d34637a"><li>过近似：到达定值用于优化无用赋值，必须有 100% 的把握保证一个定义不会被用到，才能优化</li></ul><div class="notion-text notion-block-35fa9ed6f2d28142aefeed21c7dc835f">数据抽象：程序中所有的定义 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，使用位向量表示</div><div class="notion-text notion-block-35fa9ed6f2d2819e802df7917affed23">Meet Operator:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d2817898e8cf5eb1329b43">Node Transfer:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815e8ee1fa1438df247f"><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>: B 中的赋值</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2816ab6ffe717173430ed"><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>: 不在 B 中、左值出现在 B 赋值中的赋值</li></ul><div class="notion-text notion-block-35fa9ed6f2d2812cba4fcebda100f4d7">初始化：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28168b180ff6eafbc6a92"><li>OUT[Entry]：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2813ba118cffea9addd72"><li>OUT[其余]：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><div class="notion-text notion-block-35fa9ed6f2d2816f8cb8f6eecadd3d24">结束条件：OUT 不变</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281bf97dfcfa895955199" data-id="35fa9ed6f2d281bf97dfcfa895955199"><span><div id="35fa9ed6f2d281bf97dfcfa895955199" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281bf97dfcfa895955199" title="Live-Variables-Analysis"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Live-Variables-Analysis</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d28193a7aff991d4a40530">过近似、逆向分析</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28158bbb3fb64ea7d8b41"><li>过近似：活跃变量分析用于寄存器分配</li></ul><div class="notion-text notion-block-35fa9ed6f2d28194bdfdd8b44a5a6bb3">数据抽象：程序中所有的变量 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，使用位向量表示</div><div class="notion-text notion-block-35fa9ed6f2d28108b999c5115637e734">Meet Operator:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d28134aa61d1244bec525d">Node Transfer:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d281d2a443c954be42671a">初始化：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281deabe2c1ff0d7a844e"><li>IN[Exit]: <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281a09b64f5fc6305fbda"><li>IN[其余]: <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><div class="notion-text notion-block-35fa9ed6f2d281948211fb6d877b7dba">一个比较 tricky 的地方：基本块（有多条语句）的 def 和 use 是什么？</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28150af06f75de38d1a0e"><li>def[B]: 在 B 中被赋值的变量</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28184a454dd4192501181"><li>use[B]: 在 B 中第一次被赋值前就被使用</li></ul><div class="notion-text notion-block-35fa9ed6f2d281e8a44dc2b43f8e983a">结束条件：IN 不变</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281dab0dcf9aefa858c6f" data-id="35fa9ed6f2d281dab0dcf9aefa858c6f"><span><div id="35fa9ed6f2d281dab0dcf9aefa858c6f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281dab0dcf9aefa858c6f" title="Available-Expressions-Analysis"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Available-Expressions-Analysis</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281cdb42fffe4875adff3">欠近似、正向分析</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281608889f49706760148"><li>欠近似：防止优化不能被优化的表达式</li></ul><div class="notion-text notion-block-35fa9ed6f2d281c3954eff269d9a0a21"><code class="notion-inline-code">x op y</code> 可用：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281809098df01b72f4432"><li>从程序入口到程序点 p 的<b>所有</b>路径必须经过求值 <code class="notion-inline-code">x op y</code></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810b9a37edcfafe374de"><li>在最后一次求值之后，没有 <code class="notion-inline-code">x</code> 或 <code class="notion-inline-code">y</code> 的重定义</li></ul><blockquote class="notion-quote notion-block-35fa9ed6f2d281348ef5dbf1c181b013"><div>易错例子：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2800b8eb7e3a91be21125"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:288px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Abfa1a73b-0d42-41d8-8f0b-a6ec0ae42ec7%3Aimage-20251227161122937.png?table=block&amp;id=35fa9ed6-f2d2-800b-8eb7-e3a91be21125&amp;t=35fa9ed6-f2d2-800b-8eb7-e3a91be21125" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281e3add5f4e3e06646fd"><code class="notion-inline-code">c=e^16 * x</code> 这句中，表达式 <code class="notion-inline-code">e^16 * x</code> 是<b>可用</b>的</div></blockquote><div class="notion-text notion-block-35fa9ed6f2d281deb4b2dcff25be86ee">数据抽象：程序中所有的表达式 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div><div class="notion-text notion-block-35fa9ed6f2d281a28f13f73756cf407e">Meet Operator:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d28010977fc8e7e83c5c74">Node Transfer:</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d280f2aa12f203dc2c2519">初始化：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281aa985efd2a6b26abf4"><li>OUT[Entry]: <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28108a4ecef930fe513c3"><li>OUT[其他]: <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2811888f2e36a88935318" data-id="35fa9ed6f2d2811888f2e36a88935318"><span><div id="35fa9ed6f2d2811888f2e36a88935318" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2811888f2e36a88935318" title="总结"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">总结</span></span></h4><table class="notion-simple-table notion-block-35fa9ed6f2d281c791eec139289bb5ba"><tbody><tr class="notion-simple-table-row notion-simple-table-header-row notion-block-35fa9ed6f2d281c0ae69d6bd5cfe00e9"><td class="" style="width:120px"><div class="notion-simple-table-cell">ㅤ</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">定义可达性分析</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">活跃变量分析</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">可用表达式分析</div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d2817dab51fa65f054d693"><td class="" style="width:120px"><div class="notion-simple-table-cell">定义域</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">定义集的幂集</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">变量集的幂集</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">表达式集的幂集</div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d2816aa541fe7e3fb6c499"><td class="" style="width:120px"><div class="notion-simple-table-cell">方向</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">正向分析</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">逆向分析</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">正向分析</div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d2816cac96d780478e8a29"><td class="" style="width:120px"><div class="notion-simple-table-cell">估计</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">过近似</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">过近似</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell">欠近似</div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d2813494a4c9ce69f9b082"><td class="" style="width:120px"><div class="notion-simple-table-cell">边界</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d281f18d48fcd4c2fa9a68"><td class="" style="width:120px"><div class="notion-simple-table-cell">初始化</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d281de8975ee01b5a90e83"><td class="" style="width:120px"><div class="notion-simple-table-cell">状态转移</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td></tr><tr class="notion-simple-table-row notion-block-35fa9ed6f2d2818ca5f9f90c6ff15694"><td class="" style="width:120px"><div class="notion-simple-table-cell">交汇</div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td><td class="" style="width:120px"><div class="notion-simple-table-cell"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div></td></tr></tbody></table><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281888d5bd87c0b068db2" data-id="35fa9ed6f2d281888d5bd87c0b068db2"><span><div id="35fa9ed6f2d281888d5bd87c0b068db2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281888d5bd87c0b068db2" title="数据流分析的基础"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">数据流分析的基础</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d28196ac6cd383f051b9af">数据流分析→数学表示</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28123b454c2ecafe2628b"><li>抽象：CFG 中的每个节点数据流值组成一个 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 元组</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28186895ac6bba05ca1e2"><li>迭代：每次迭代相当于一个函数 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 作用在 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 元组上产生一个新的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 元组</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28106954cda2526faef4a"><li>终止：连续两次迭代结果完全相同</li></ul><div class="notion-text notion-block-35fa9ed6f2d281ceb979e8d2be084441">定义：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281ee974dcda68da505de"><li>偏序集：集合 + 二元关系（自反、传递、反对称）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817fb71ed9b4d169f3ae"><li>bound</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817fb71ed9b4d169f3ae"><li>最小上界（LUB）：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>最大下界（GLB）：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>Join：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>, Meet：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281dda721d4fc82c0001b"><li>定理：一个偏序集如果存在 LUB 和 GLB，则是唯一的</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281bfaa97dc6914d82659"><li>格：任意两元素的 join 和 meet 都存在</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f3bd91d250e8cafd53"><li>全格：所有子集都有最小上界和最大下界</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28145a5d2f7e459cf05e1"><li>定理：有限格都是全格</li></ul><div class="notion-text notion-block-35fa9ed6f2d281e3a08ad17337d2158e">数据流分析的迭代算法的时间复杂度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，其中 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 为 CFG 的结点个数， <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 为定义域格的高度</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2814586d4c36e31fa0085" data-id="35fa9ed6f2d2814586d4c36e31fa0085"><span><div id="35fa9ed6f2d2814586d4c36e31fa0085" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2814586d4c36e31fa0085" title="过程间分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">过程间分析</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2815f80dbc389954b25ad">Java 中的方法调用：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e98d2ff11bf80d47f5"><li>静态调用：静态方法</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28155bd46f3caa406a4df"><li>特殊调用：构造函数，私有实例方法，基类实例方法</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d5a0c5c84d54053791"><li>虚调用：其他的实例方法（运行时才可以确定）</li></ul><div class="notion-text notion-block-35fa9ed6f2d281f3a5c4c2253396bd2c">方法的 Dispatch：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810bb17ddbb7720713ca"><li>Dispatch(c,m)：c 是接受对象的类型，m 是方法签名</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810e8061c50e621782cf"><li>过程：从接受对象所在的类开始，按照从子类向到基类的顺序查找，直到找到一个方法名和描述符都相同的非抽象方法为止</li></ul><div class="notion-text notion-block-35fa9ed6f2d28182800ff8ab0282534d">类层级结构分析（Class Hierarchy Analysis，CHA）</div><div class="notion-text notion-block-35fa9ed6f2d2817c8b1fd790e8810571">调用点的 Resolve：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281fcb6aed4c0264f007a"><li>Resolve(cs)：返回调用点 cs 可能调用的所有方法</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2814aaf9de8476bd8ab57"><li>过程：设 c 为调用点接受对象的声明类型，m 为调用点处的函数签名。对 c 的所有子类（直接、间接子类）c’，将 Dispatch(c’,m) 加入返回值集合</li></ul><div class="notion-text notion-block-35fa9ed6f2d28158bd3dc94858942eea">易错点：是将 c 所有子类 Dispatch 的方法加入，如：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2818b8abfc938b857f5d4"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:288px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://static-analysis.cuijiacai.com/assets/img/cha-eg.ec7542f4.png?spaceId=570a9ed6-f2d2-8153-a8bd-00033a9c6bb3&amp;t=35fa9ed6-f2d2-818b-8abf-c938b857f5d4" alt="cha-eg" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281c69cdae9cfe3437dd3">对于 <code class="notion-inline-code">B b = ...</code>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div><div class="notion-text notion-block-35fa9ed6f2d281469a74da49159b84ab">有 <code class="notion-inline-code">A.foo()</code> 的原因是 <code class="notion-inline-code">Dispatch(B, foo())</code> 返回 <code class="notion-inline-code">A.foo()</code></div><div class="notion-text notion-block-35fa9ed6f2d281db9bd7c17b64410255">CHA 的特点：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28194a7d4fab4d82870f6"><li>优点：快</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28194a7d4fab4d82870f6"><li>只考虑了调用点处接收对象的声明类型及其继承结构</li><li>忽略数据流和控制流信息</li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281a781b6e971db20093f"><li>缺点：不精确</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281a781b6e971db20093f"><li>很容易引入虚假的目标方法</li></ul></ul><div class="notion-text notion-block-35fa9ed6f2d281f4b037c32dc99e3e85">通过 CHA 构建调用图（Call Graph Construction）的方法：</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281818fcace7e5d83941c" style="list-style-type:decimal"><li>从入口方法开始（通常为main方法）</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818e9c09f827df65519d" style="list-style-type:decimal"><li>对于每个可达的方法 m，通过 CHA 解析 m 中的每个调用点 cs 的目标方法，即 Resolve(cs)</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fca589d43249d2be27" style="list-style-type:decimal"><li>重复上述过程，直到没有发现新的方法为止</li></ol><div class="notion-text notion-block-35fa9ed6f2d281b2bf05eab43ccda291">ICFG：过程间控制流图</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281b29cb6c7bffb495c02"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://static-analysis.cuijiacai.com/assets/img/icfg-eg.5d2f836d.png?spaceId=570a9ed6-f2d2-8153-a8bd-00033a9c6bb3&amp;t=35fa9ed6-f2d2-81b2-9cb6-c7bffb495c02" alt="icfg-eg" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281ffb141f1c0e52102b3"><li>call edge: 传参</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28190a020db48aa2ea399"><li>return edge: 传返回值</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281739f64ec224959e897"><li>call-to-return edge: 传 local 数据流</li></ul><div class="notion-text notion-block-35fa9ed6f2d281398699ef61cb63d39a">过程间数据流分析 = 节点转移 + 边转移</div><div class="notion-text notion-block-35fa9ed6f2d281c9bccdfd67f3becfcc">Edge Transfer（以过程间常量传播为例）：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f6b421d367074cea8f"><li>Normal Edge: 恒等函数</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28184b9ecec93d08c2fa7"><li>Call-Return Edge: kill 左值变量，其余不变</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2811ab05feeb0f0590216"><li>Call Edge: 传参</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281388f67d25850b81e98"><li>Return Edge: 传返回值</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2812eba9ec718d2d8f09f" data-id="35fa9ed6f2d2812eba9ec718d2d8f09f"><span><div id="35fa9ed6f2d2812eba9ec718d2d8f09f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2812eba9ec718d2d8f09f" title="第三部分：指针分析及其应用"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">第三部分：指针分析及其应用</span></span></h3><div class="notion-text notion-block-35fa9ed6f2d281718970c44dcbad3dbf">指针分析： May analysis，分析程序中的一个指针可能会指向哪些内存区域</div><div class="notion-text notion-block-35fa9ed6f2d281c2b0dfd45ab99f2e1a">别名分析：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2811e9c6ef37dbb849e41"><li>两个指针互为别名：两个指针指向同一块内存区域（对象）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281a3b29ff0123e679a1f"><li>指针分析回答的是一个指针可能会指向哪些对象，别名分析回答的是两个指针是否会指向同一个对象</li></ul><div class="notion-text notion-block-35fa9ed6f2d2812ea71aec4d28a5979b">堆抽象：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281c8adb9cef10ae84d7d"><li>Allocation Site Abstraction: 将一个分配点（new 语句）分配的所有对象，抽象成为一个对象</li></ul><div class="notion-text notion-block-35fa9ed6f2d281bc96dcc8a99bc5c867">call 时不添加 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 作为 PFG 的边: 因为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 可以更精确地被处理（仅在 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 时才将 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 加入到 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 中）</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281e0841ef2ad645aba2a" data-id="35fa9ed6f2d281e0841ef2ad645aba2a"><span><div id="35fa9ed6f2d281e0841ef2ad645aba2a" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281e0841ef2ad645aba2a" title="上下文敏感（C.S.）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">上下文敏感（C.S.）</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281c0b116c82b35d3c7ca">上下文敏感的堆</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281009bc5ed8b07119572"><li>为什么需要 CS Heap：如果没有 CS Heap，不同上下文调用方法时，被调用方法的内部产生的对象仍然被混在一起，精度提升不明显</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2818b9214cb37f7beac1a"><li>在上下文不敏感分析中，CS Heap <b>不会</b>对精度有提升作用！！</li></ul><div class="notion-text notion-block-35fa9ed6f2d281b6a20cc19646d72a1c">在方法调用时，会使用 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 为目标方法选择一个上下文，不同的上下文策略仅是 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 不同（解耦），其余框架相同</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2818181b4d6de88e88df6" data-id="35fa9ed6f2d2818181b4d6de88e88df6"><span><div id="35fa9ed6f2d2818181b4d6de88e88df6" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2818181b4d6de88e88df6" title="上下文敏感的几种变体"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">上下文敏感的几种变体</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811abb1fe1e40e274d3a" style="list-style-type:decimal"><li>调用点敏感（Call-Site Sensitivity）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811abb1fe1e40e274d3a" style="list-style-type:lower-alpha"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d5a4abfd54ef10d6a6"><li>Intuition：既然上下文是调用产生的，那么就将调用点作为上下文（记得从哪里来）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2818da579f8dc48bd1999"><li>实际中为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>-Limiting Context Abstraction，方法上下文和堆上下文可能会使用不同的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815481f5d57134074c16" style="list-style-type:decimal"><li>对象敏感（Object Sensitivity）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815481f5d57134074c16" style="list-style-type:lower-alpha"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281eaab7af76488717039"><li>Intuition：既然数据是由对象携带的，那就将每次调用的接受对象（receiver object）作为上下文（记得我是谁）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28144bee6eed92c1188d0"><li>也可以限制上下文的尺寸 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28183b00ef0c1f7762e5b" style="list-style-type:decimal"><li>类型敏感（Type Sensitivity）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28183b00ef0c1f7762e5b" style="list-style-type:lower-alpha"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281a3b3f9e4850c90bbfa"><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 表示 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 在哪个类被创建（container）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281208dcec078e2651338"><li>在相同的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 下类型敏感的精确性 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 对象敏感，因为类型敏感是对象敏感的抽象</li></ul></ol></ol><div class="notion-text notion-block-35fa9ed6f2d28136a23ce445d8c78fc8">对比：在 OO 语言的实践过程中，有如下结论：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281698a9ade7d7b3868f2"><li>精度：Object &gt; Type &gt; Call-Site</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2814a8b7bfd13fbfde28f"><li>效率：Type &gt; Call-Site &gt; Object</li></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2816580cfd29d96535f1c" data-id="35fa9ed6f2d2816580cfd29d96535f1c"><span><div id="35fa9ed6f2d2816580cfd29d96535f1c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2816580cfd29d96535f1c" title="污点分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">污点分析</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2815a9597ca1966eab90e">Sources：污点源方法的集合（会返回污点数据的方法调用）</div><div class="notion-text notion-block-35fa9ed6f2d28163b2beca8a0bea7841">Sinks：带有敏感参数的水槽方法的集合（元组，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 表示方法 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的第 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个参数是 sink）</div><div class="notion-text notion-block-35fa9ed6f2d2815cbb4af0daaae91404">信息流安全（Information Flow Security） 是指通过追踪信息是如何在程序中流动的方式，来确保程序安全地处理了它所获得的信息。</div><div class="notion-text notion-block-35fa9ed6f2d281a8a3bccb319eca7ec2">机密性（Confidentiality） 指的是阻止机密的信息泄漏</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815d85bcf185040101d8"><li>信息只能从低机密的数据流向高机密</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d4b0acf4da8bdfa028"><li>读保护</li></ul><div class="notion-text notion-block-35fa9ed6f2d281beadbed56105eea37c">完整性（Integrity） 指的是阻止不信任的信息污染受信任的关键信息</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810692aecdd1b34df078"><li>不允许信息从不信任流向信任</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281c7b26dcdd466c07f78"><li>注入攻击破坏了完整性</li></ul><div class="notion-text notion-block-35fa9ed6f2d2817e9828d068f720b275">显示流：信息可以通过直接拷贝的方式进行流动</div><div class="notion-text notion-block-35fa9ed6f2d28197b9d5df9e621e369d">隐式流：信息可以通过<b>影响控制流</b>的方式向外传递</div><div class="notion-text notion-block-35fa9ed6f2d2818781b9edf95a2ad75d">信道：计算 系统中指示信息的机制</div><div class="notion-text notion-block-35fa9ed6f2d281719756faa2c14fb7b3">指示信息的机制的本意并不是信息传递，这样的信道称为<b>隐蔽信道</b>：隐式流、终止信道、时间信道、异常</div><div class="notion-blank notion-block-35fa9ed6f2d280ae9593ff7ad2032cec"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[数据结构—期末笔记]]></title>
            <link>http://arys.top/article/ds-final</link>
            <guid>http://arys.top/article/ds-final</guid>
            <pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍了常用数据结构与对应算法的分析。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d280b3a222c20b8290bfc9"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d280ab9e76ee60ae0503ac"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🗒️">🗒️</span></div><div class="notion-callout-text">这篇是南京大学 <span class="notion-yellow"><a class="notion-link" href="https://cs.nju.edu.cn/lwj/course/ds.html" target="_blank" rel="noopener noreferrer">数据结构</a></span> 24 Fall 的期末复习笔记。</div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281949c29d56ac15b214c" data-id="35fa9ed6f2d281949c29d56ac15b214c"><span><div id="35fa9ed6f2d281949c29d56ac15b214c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281949c29d56ac15b214c" title="栈"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">栈</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d29799da81d60bfac6" style="list-style-type:decimal"><li>一个栈 (无穷大) 的进栈顺序 1, 2, ⋯, n 有多少个不同的出栈顺序?卡特兰数:</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d29799da81d60bfac6" style="list-style-type:lower-alpha"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812eb719fab0c0ca3e1d" style="list-style-type:decimal"><li>中缀表达式转后缀表达式</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812eb719fab0c0ca3e1d" style="list-style-type:lower-alpha"><li>代码实现引入: 操作符优先级, 分栈内和栈外. 当遇到操作数时, 直接输出. 当遇到操作符时: 如果当前操作符的栈外优先级大于栈顶操作符的栈内优先级, 当前操作符进栈, 否则 <code class="notion-inline-code">pop</code> 栈顶操作符并输出.</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281119e92d8d9a416a5c7" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280b386bbfb77fd4a96a2"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A8ae25cc3-7312-497d-96d5-8c2041ea09da%3As1.png?table=block&amp;id=35fa9ed6-f2d2-80b3-86bb-fb77fd4a96a2&amp;t=35fa9ed6-f2d2-80b3-86bb-fb77fd4a96a2" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>人工: 按照中缀表达式的运算顺序, 先算哪个就先转哪个.</li></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281ce90e9e3050b6f00a2" data-id="35fa9ed6f2d281ce90e9e3050b6f00a2"><span><div id="35fa9ed6f2d281ce90e9e3050b6f00a2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281ce90e9e3050b6f00a2" title="数组, 串与广义表"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">数组, 串与广义表</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28141bfaec4d43b1866f4" data-id="35fa9ed6f2d28141bfaec4d43b1866f4"><span><div id="35fa9ed6f2d28141bfaec4d43b1866f4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28141bfaec4d43b1866f4" title="字符串"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">字符串</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819c9c8afb09612089fe" style="list-style-type:decimal"><li>KMP 算法</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819c9c8afb09612089fe" style="list-style-type:lower-alpha"><li>简介: 通过预处理目标字符串, 避免在查找时产生回溯, 线性复杂度.</li><li><code class="notion-inline-code">next</code> 数组</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814c9b7ef73eba5cf628" style="list-style-type:lower-roman"></ol><li>查找</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e8b33af72d2c1382ed" style="list-style-type:lower-roman"></ol></ol></ol><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281048bf7db06d5b27466" data-id="35fa9ed6f2d281048bf7db06d5b27466"><span><div id="35fa9ed6f2d281048bf7db06d5b27466" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281048bf7db06d5b27466" title="广义表"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">广义表</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812c9363c41389c61b97" style="list-style-type:decimal"><li>表的第一个元素称为广义表的表头(head), 其它表元素<b>组成的表</b>称为广义表的表尾(tail)</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813b881bc560d4947ef8" style="list-style-type:decimal"><li>长度: 元素个数, 子表算一个元素</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281799aa3e1cb705cd5d6" style="list-style-type:decimal"><li>深度: 最多能脱几层括号. 空表的深度为 1.</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a6a2b1ff8da7418c88" style="list-style-type:decimal"><li>类型定义</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a6a2b1ff8da7418c88" style="list-style-type:lower-alpha"><li>节点类型 <code class="notion-inline-code">utype</code>: 表头(0), 原子数据(1), 子表(2)</li><li>信息 <code class="notion-inline-code">info</code>: 表头的信息是引用计数, 原子数据的信息是其值, 子表的信息是子表指针.</li><li>尾指针 <code class="notion-inline-code">tlink</code>: 表头的尾指针指向表的第一个节点, 其他的尾指针指向同一层的下一个节点.</li></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810db6d3c028f75ffab1" style="list-style-type:decimal"><li>示例</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810db6d3c028f75ffab1" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280e9b5d7e790ab54e195"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ae84a6d70-64b9-40cd-8db1-9af8701936d5%3Agenlist.png?table=block&amp;id=35fa9ed6-f2d2-80e9-b5d7-e790ab54e195&amp;t=35fa9ed6-f2d2-80e9-b5d7-e790ab54e195" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811aa6c7e6e8475aedb0" style="list-style-type:decimal"><li>广义表的图形表示和存储表示</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811aa6c7e6e8475aedb0" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2808e85acd3ca7b78764f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A81a580f7-f3d8-408a-9b9d-784edae72b50%3Agenlst.png?table=block&amp;id=35fa9ed6-f2d2-808e-85ac-d3ca7b78764f&amp;t=35fa9ed6-f2d2-808e-85ac-d3ca7b78764f" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28129a855e6edb4fc52ee" style="list-style-type:decimal"><li>广义表的复制: 标准的 DFS 递归算法</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281078b80dd0c1f1fe749" style="list-style-type:decimal"><li>广义表的删除:</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281078b80dd0c1f1fe749" style="list-style-type:lower-alpha"><li>算法</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c49501dcb01eef936e" style="list-style-type:lower-roman"><li>引用计数 -1</li><li>如果引用计数为 0, 横扫表顶层, 遇到原子节点(即 <code class="notion-inline-code">utype = 1</code>)直接删掉, 遇到子表节点(即 <code class="notion-inline-code">utype = 2</code>)先递归调用删除子表节点指向的子表, 然后删除子表节点.</li><li>注意: 只有表头(即 <code class="notion-inline-code">utype = 0</code> 的)节点需要调用 <code class="notion-inline-code">remove</code> 进行递归删除.</li></ol><li>示例</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281999663facaebaad10b" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280caba54e476c5bc6778"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A91e1db57-7106-435f-bfe4-32927ceefdf7%3Agenlist2.png?table=block&amp;id=35fa9ed6-f2d2-80ca-ba54-e476c5bc6778&amp;t=35fa9ed6-f2d2-80ca-ba54-e476c5bc6778" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d280bf920df27db3f28a43">B G H F C L K J I D E A</div></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281b6b248c973fb6a33e7" data-id="35fa9ed6f2d281b6b248c973fb6a33e7"><span><div id="35fa9ed6f2d281b6b248c973fb6a33e7" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281b6b248c973fb6a33e7" title="树"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">树</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281059f60eb63f72604e4" style="list-style-type:decimal"><li>二叉树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281059f60eb63f72604e4" style="list-style-type:lower-alpha"><li>对任何一棵二叉树, 如果其叶结点有 n0 个, 度为 2 的结点有 n2 个, 则有 n0 = n2 + 1</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281ebabd1e8186e220467" style="list-style-type:lower-roman"><li>推导: 二叉树有 n 个顶点, n - 1 条边, n = n0 + n1 + n2, n - 1 = 2n2 + n1, 移项可得</li><li>即: 二叉树的叶子结点总比度为 2 的结点多一个.</li></ol><li>具有 n 个结点的完全二叉树的深度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281098ad7c374a977b232" style="list-style-type:decimal"><li>二叉树的表示</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281098ad7c374a977b232" style="list-style-type:lower-alpha"><li>顺序表示</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281868576c760c96e2af3" style="list-style-type:lower-roman"><li>用数组, 适合表示完全二叉树, 如: -1 1 2 3 4 5 6 7 8</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28148addcd7ce0ac305c7" style="list-style-type:decimal"><div class="notion-text notion-block-35fa9ed6f2d281d29694e5090fb61489">这种情况下, 假设一个结点位于下标 <code class="notion-inline-code">i</code>, 那么其父结点位于 <code class="notion-inline-code">i / 2</code>, 左子结点位于 <code class="notion-inline-code">2 * i</code>, 右子结点位于 <code class="notion-inline-code">2 * i + 1</code></div></ol><li>前序遍历的非递归算法: 拿到一个结点, 先访问, 然后将右子树压栈, 进入左子树. 当进入的是空树时, 退栈并拿到栈顶元素访问(重复).</li><li>中序遍历的非递归算法: 拿到一个结点, 先将其压入栈中, 然后拿到左子树访问. 当访问的是空树时, 退栈, 拿到栈顶元素, 先访问, 然后拿到右子树(重复).</li><li>后序遍历的非递归算法: (后序遍历的非递归算法要求必须知道栈中结点是第几次退栈, 这里我们假设将一个计数和结点一起压栈.) 拿到一个结点, 先将其压入栈中(with 0), 然后拿到其左子树(重复). 当进入空树时, 退栈, 拿到栈顶元素, 看其计数. 若为 0, 则拿到其右子树(重复). 若为 1, 则访问, 并再次退栈, 拿到栈顶元素(重复).</li><li>层序遍历算法: 用一个队列, 每当拿到一个节点, 先访问, 然后将左右子树按顺序入队, 再拿到队首元素(重复).</li><li>在二叉树的遍历中, 前序和后序遍历<b>不可以</b>用来确定一棵唯一的二叉树(左右子树无法区分).</li></ol><li>树对应的二叉树: 子女-兄弟表示法. 示例:</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e1b43ee13bb99d3d54" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280fe9da8da989d749ab0"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ad2f213aa-60df-4256-a56f-e2cf58ac511a%3Atree2bin.png?table=block&amp;id=35fa9ed6-f2d2-80fe-9da8-da989d749ab0&amp;t=35fa9ed6-f2d2-80fe-9da8-da989d749ab0" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>森林对应的二叉树: 先将各树转换为对应的二叉树, 然后把第二棵树的根节点作为第一棵树的右子树, 第三棵树的根节点作为第二棵树的右子树, 以此类推.</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811c9cbad6eb0c98eef2" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28058b03bdfd53a01f452"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A147a3294-1c73-4993-923e-e51ef6c78183%3Aforest2bin.png?table=block&amp;id=35fa9ed6-f2d2-8058-b03b-dfd53a01f452&amp;t=35fa9ed6-f2d2-8058-b03b-dfd53a01f452" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>根结点的高度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> .</li></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dfa24ce87b63c8f6be" style="list-style-type:decimal"><li>线索化二叉树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dfa24ce87b63c8f6be" style="list-style-type:lower-alpha"><li>基本概念</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bd816cddd46e67ccfa" style="list-style-type:lower-roman"><li>线索(Thread):</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816cac9ccfcb23bf8043" style="list-style-type:decimal"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2818c98abf0ae4d366c16"><li>如果一个节点的左子节点为空, 则该节点的左指针指向该节点的前驱节点.</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28159810cea4be9ab8beb"><li>如果一个节点的右子节点为空, 则该节点的右指针指向该节点的后继节点.</li></ul></ol><li>线索化:</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a98377f98e368f51b6" style="list-style-type:decimal"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281ba8b32fc277ae6157e"><li>按照<b>某种遍历方式</b>, 将二叉树中的空指针替换为指向前驱或后继节点的指针的过程称为线索化.</li></ul></ol></ol><li>数据结构:</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f4991cfd08cb6af2a4" style="list-style-type:lower-roman"></ol><li>代码实现思路: 在X序遍历的函数中, 添加一个参数 <code class="notion-inline-code">pre</code> 作为当前结点的前驱. 拿到一个结点, 若空返回. 检查其左子树, 若不空则递归调用, 若空则 <code class="notion-inline-code">root-&gt;left = pre</code>. 检查前驱, 若 <code class="notion-inline-code">pre != NULL &amp;&amp; pre-&gt;right == NULL</code>, 则 <code class="notion-inline-code">pre-&gt;right = curr;</code>. 递归调用其右子树.</li></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816a92f0f721f651f3b2" style="list-style-type:decimal"><li>多叉树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816a92f0f721f651f3b2" style="list-style-type:lower-alpha"><li>先根遍历与这棵树对应的二叉树的<b>前序</b>遍历结果相同.</li><li>后根遍历与这棵树对应的二叉树的<b>中序</b>遍历结果相同(存疑, 这是 PPT 上的说法, 实际上应该对应后序遍历).</li><li>用”子女-兄弟表示法”表示森林, 就相当于把第一棵树的根作为根, 将其他树作为这个根的后继.</li></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d89d0ffc0257557470" style="list-style-type:decimal"><li>哈夫曼树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d89d0ffc0257557470" style="list-style-type:lower-alpha"><li>路径长度</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810f8f68c74cf4396ba0" style="list-style-type:lower-roman"><li>结点间的路径长度 (Path Length) = 两点之间的边数</li><li>树的外部路径长度 (External PL) = 叶结点到根结点路径长度之和</li><li>树的内部路径长度 (Internal PL) = 非叶结点到根结点路径长度之和</li><li>带权路径长度 (Weighted PL) = (叶结点到根结点路径长度 * 叶结点的权值) 之和</li></ol><li>哈夫曼树的定义: 带权路径长度达到最小的扩充二叉树</li><li>构造方法: 选择两个最小的权值, 构造一棵二叉树, 这棵新树的权值就为两个子节点权值之和. 重复至只剩一个结点.</li><li>特点: 权值大的节点离根近</li><li>哈夫曼编码: 前缀码. 一个叶结点的权值表示它在串中出现的次数.</li></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281a49789cc9f482be1ef" data-id="35fa9ed6f2d281a49789cc9f482be1ef"><span><div id="35fa9ed6f2d281a49789cc9f482be1ef" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281a49789cc9f482be1ef" title="集合与字典"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">集合与字典</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281509a95fd62b7c5c4ad" data-id="35fa9ed6f2d281509a95fd62b7c5c4ad"><span><div id="35fa9ed6f2d281509a95fd62b7c5c4ad" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281509a95fd62b7c5c4ad" title="并查集"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">并查集</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2812396a7d151e0ade452">单数组 + 按秩合并 + 路径压缩的并查集</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281efaa43feb2872a101d" data-id="35fa9ed6f2d281efaa43feb2872a101d"><span><div id="35fa9ed6f2d281efaa43feb2872a101d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281efaa43feb2872a101d" title="散列表"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">散列表</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dda6e3dafdd18b8340" style="list-style-type:decimal"><li>数字分析法：计算符号分布均匀度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 值。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dda6e3dafdd18b8340" style="list-style-type:lower-alpha"><li>仅用于事先明确知道表中所有关键码每一位的数值分布情况。</li><li>本质：已知离散的均匀分布，计算方差。</li><li>n 个 d 位数，每一位上可能有 r 个不同的符号，每种符号出现的机会均等。公式如下：
<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 表示第 i 个符号在第 k 位上出现的次数。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281318055f56256fe295d" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fba7c7ff60c76bbf2c" style="list-style-type:decimal"><li>线性探查法（Linear Probing）（闭散列法处理冲突）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fba7c7ff60c76bbf2c" style="list-style-type:lower-alpha"><li>插入：计算 hash，从 hash 为下标开始找第一个空地插入（若查到数组尾可从头开始）。</li><li>查找：计算 hash，从 hash 为下标开始找，直到找到元素，或找到空地查找失败。</li><li>搜索成功的搜索长度：表中所有的元素各查找一遍，计算平均值。</li><li>搜索失败的搜索长度：表中_<b>可以被 hash 覆盖</b>_的下标各进行一次查找失败，计算平均值。</li><li>注意：内部的数组长度可能比 hash 覆盖的要长，这一部分是为了处理冲突使用的。</li></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28180bbe5dae944c9d7d2" style="list-style-type:decimal"><li>二次探测再散列</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28180bbe5dae944c9d7d2" style="list-style-type:lower-alpha"><li>计算出 hash 值后，如果有冲突，依此检测以下位置：hash+1^2, hash-1^2, hash+2^2, hash-2b^2, … , hash+k^2, hash-k^2</li></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814fb3ebeb6fbd25775b" style="list-style-type:decimal"><li>链地址法（开散列法处理冲突）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814fb3ebeb6fbd25775b" style="list-style-type:lower-alpha"><li>搜索成功的搜索长度：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e28522e8e31538841f" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280ccb4efce3644e1cd76"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A0216b331-c196-42d0-9af3-09e4b66660cf%3Aaslsucc.png?table=block&amp;id=35fa9ed6-f2d2-80cc-b4ef-ce3644e1cd76&amp;t=35fa9ed6-f2d2-80cc-b4ef-ce3644e1cd76" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>搜索失败的搜索长度：设空表的长度为 1，则所有表长度之和的平均值。</li></ol></ol><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281d68579c3b979be1854" data-id="35fa9ed6f2d281d68579c3b979be1854"><span><div id="35fa9ed6f2d281d68579c3b979be1854" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281d68579c3b979be1854" title="搜索结构"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">搜索结构</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bdb21cfe2d017e3b33" style="list-style-type:decimal"><li>搜索判定树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bdb21cfe2d017e3b33" style="list-style-type:lower-alpha"><li>用圆圈表示有值节点，用方框表示空节点（搜索失败的点）</li><li>计算搜索长度时注意：判断节点为空不算一次搜索次数。</li><li>例题：有序顺序表中的元素为：17, 94, 154, 170, 275, 503, 509, 512, 553, 612, 677, 765, 897, 908. 求折半搜索的判定树和搜索成功/失败的平均搜索长度。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813b9c5eea2d83965d7f" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280f991b0f081b80931e8"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Adb5f814b-90c7-4d5b-8987-50d66c1c9b6f%3Ast.png?table=block&amp;id=35fa9ed6-f2d2-80f9-91b0-f081b80931e8&amp;t=35fa9ed6-f2d2-80f9-91b0-f081b80931e8" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281728ac2da88b6616db9" style="list-style-type:decimal"><li>二叉搜索树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281728ac2da88b6616db9" style="list-style-type:lower-alpha"><li>性质：左小右大。</li><li>对 BST 进行中序遍历，可以得到一个从小到大的序列。</li><li>删除：叶子直接删；左/右为空则用右/左替代；都不为空则选择右子树最左节点替代，并改为删除该节点。</li></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f49b8bf9346d77922c" style="list-style-type:decimal"><li>AVL 树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f49b8bf9346d77922c" style="list-style-type:lower-alpha"><li>节点的平衡因子：右子树的高度减去左子树的高度的高度差（右-左）。</li><li>插入的平衡化旋转</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281568d02d9715308e14e" style="list-style-type:lower-roman"><li>判断方法：插入后，从插入结点沿通向根的路径向上回溯。如果在某一结点发现高度不平衡，停止回溯。从发生不平衡的结点起，沿刚才回溯的路径取直接下两层的结点（即从不平衡节点<b>沿着插入路径取两个节点</b>）。再根据下图进行判断：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e88047f8d1a9c53838" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280ab9904e4339d2b0efd"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A065fa4f2-5609-4e2e-a784-29e983d5b85d%3Arotate.png?table=block&amp;id=35fa9ed6-f2d2-80ab-9904-e4339d2b0efd&amp;t=35fa9ed6-f2d2-80ab-9904-e4339d2b0efd" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>删除的平衡化旋转</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28173a952e5405c33db0a" style="list-style-type:decimal"><li>删除方法和 BST 相同（中序的直接前驱或后继替代）</li><li>维护一个 <code class="notion-inline-code">shorter</code> 变量，若 <code class="notion-inline-code">shorter</code> 为 True 说明树被缩短，需要继续检查。若为 False 则说明树没有缩短，则无需向上继续检查。</li><li>在 <code class="notion-inline-code">shorter</code> 为 True 时执行以下检查：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f483deda78977fb7c7" style="list-style-type:lower-alpha"><li>当前节点的 bf 为 0，则将 bf 改为 1 或 -1，并停止检查。</li><li>当前节点的 bf 不为 0 且较高的子树被缩短，则将 bf 改为 0，还需要继续向上检查。</li><li>当前节点的 bf 不为 0 且较矮的子树被缩短，则设当前节点为 p，较高子树根为 q，根据 bf 进行操作：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28185935dfd973b8e4d01" style="list-style-type:lower-roman"><li>若 q 的 bf 为 0，则执行一个单旋转，并停止检查。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e6b1ced15a181a9383" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280409e73e654e88f8bfb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:192px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aadae2cb4-f4e0-458a-8856-f268e7649b82%3Adel1.png?table=block&amp;id=35fa9ed6-f2d2-8040-9e73-e654e88f8bfb&amp;t=35fa9ed6-f2d2-8040-9e73-e654e88f8bfb" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>若 p 和 q 的 bf 相同，则执行一个单旋转，并将 p 和 q 的 bf 均设置为 0，还需要继续向上检查。</li><li>若 p 和 q 的 bf 异号，则执行双旋，将根节点的 bf 设置为 0，继续向上检查。</li></ol></ol></ol></ol><li>性能分析：搜索、插入、删除（并作平衡化旋转）的时间复杂度</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a597d9ea76053f491b" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281d2b48dc6be4f6cd231" data-id="35fa9ed6f2d281d2b48dc6be4f6cd231"><span><div id="35fa9ed6f2d281d2b48dc6be4f6cd231" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281d2b48dc6be4f6cd231" title="图"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">图</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c79d2ce8e9a03cf4b2" style="list-style-type:decimal"><li>图的表示</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c79d2ce8e9a03cf4b2" style="list-style-type:lower-alpha"><div class="notion-text notion-block-35fa9ed6f2d281ee80a1f9adf04ba80b">演示示例：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280f280abd2bf68d1f66c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:240px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A3230f95e-b95e-4e72-a55b-b62213fb38ee%3Agraph.png?table=block&amp;id=35fa9ed6-f2d2-80f2-80ab-d2bf68d1f66c&amp;t=35fa9ed6-f2d2-80f2-80ab-d2bf68d1f66c" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2816eb79fcc8f2590e5a9">注：XX表分为顶点表和边表。顶点表存放该顶点的<span class="notion-inline-underscore">名字</span>和边链表<span class="notion-inline-underscore">头指针</span>。一般在顶点表左侧编号，在边链表中就用编号代替节点。边链表中的节点按照表的要求存放不同数据。</div><li>有向图的逆邻接表（入边表）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815ba8bed821db712412" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280a39373f0230ea879ea"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:336px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aeb21865d-4241-4e10-a369-2c9589ff41e0%3Arnl.png?table=block&amp;id=35fa9ed6-f2d2-80a3-9373-f0230ea879ea&amp;t=35fa9ed6-f2d2-80a3-9373-f0230ea879ea" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>无向图的邻接多重表</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b187c2c5e7997149c0" style="list-style-type:lower-roman"><div class="notion-text notion-block-35fa9ed6f2d28115a5dbdc84101ad14e">顶点节点：名称 + 第一条出边。（这里的排序按照 <code class="notion-inline-code">pair&lt;first_vec, second_vec&gt;</code> 规则，小的在前）</div><div class="notion-text notion-block-35fa9ed6f2d281d9b86ae88b6eab97e8">边节点：<code class="notion-inline-code">mark | v1 | v2 | path1 | path2</code></div><div class="notion-text notion-block-35fa9ed6f2d2810293b7cdd9960bc2fa">mark 记录是否处理过的标记，v1 v2 表示该边两个的节点，path1 指向 v1 的下一条边，path2 指向 v2 的下一条边。</div><div class="notion-text notion-block-35fa9ed6f2d28158b8bfe1ac2b6f1d05">例图：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2800ab4aec1d821cd09f7"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ad3e54b0f-9633-436e-a7e4-f59469339f67%3Audgnml.png?table=block&amp;id=35fa9ed6-f2d2-800a-b4ae-c1d821cd09f7&amp;t=35fa9ed6-f2d2-800a-b4ae-c1d821cd09f7" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281efa43de2cbede8f023">注意这里画的看上去 v2 的边链表头指针指向的是 1-2 边的末尾，其只是为了在视觉上像链表，和 v1 指向的是一个东西。</div><div class="notion-text notion-block-35fa9ed6f2d28132a0fae718d732059a">要点：先画边再连线。</div></ol><li>有向图的邻接多重表（十字链表）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d0acaaf72b8dbfafb3" style="list-style-type:lower-roman"><div class="notion-text notion-block-35fa9ed6f2d28178ac88eb7667beeb35">顶点节点：<code class="notion-inline-code">data | first in | first out</code></div><div class="notion-text notion-block-35fa9ed6f2d2818a93caf55dc18228a8">data 表示名称，first in 指向以该节点为终点的第一条边，first out 指向以该节点为起点的第一条边。</div><div class="notion-text notion-block-35fa9ed6f2d281628e05fd8faa8a5033">边节点：<code class="notion-inline-code">mark | v1 | v2 | path1 | path2</code></div><div class="notion-text notion-block-35fa9ed6f2d281febb77faacdaba6cdc">mark 是处理标记，v1 和 v2 为起点和终点，path1 指向以 v1 为起点的下一条边，path2 指向以 v2 为终点的下一条边。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280d2a4bce35bda2d111c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ab1e07df0-97fc-4ad2-b014-c66d13c54a3f%3Across.png?table=block&amp;id=35fa9ed6-f2d2-80d2-a4bc-e35bda2d111c&amp;t=35fa9ed6-f2d2-80d2-a4bc-e35bda2d111c" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>最小生成树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28195b4aee118b116b017" style="list-style-type:lower-roman"><li>Prim</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818f8c3edefc303bf4a6" style="list-style-type:decimal"><li>描述: 从<b>任意</b>一个顶点开始, 每次选择一个与当前顶点集最近的一个顶点, 并将两顶点之间的边加入到树中 (贪心).</li><li>时间复杂度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>适用于稠密图</li></ol><li>Kruskal</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c9af6ced0aabf06844" style="list-style-type:decimal"><li>描述：每次在 E 中选择一个最小权值的，落在两个连通分量之间的边。</li><li>时间复杂度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> (E &lt; V^2). <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> if pre sorted.</li><li>适用于稀疏图</li></ol><li>当有相同权值的边时，产生的最小生成树可能不唯一。</li></ol><li>最短路</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281ccb36eead09c342e12" style="list-style-type:lower-roman"><li>非负权值单源最短路（Dijkstra）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b88347e0f965e5bf9d" style="list-style-type:decimal"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28196872ee6ce57bcb248"><li>广度优先搜索：基于 <b>当前节点到源点的累计距离</b> 来排序。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e0ba09cbc73319a0c0"><li>时间复杂度</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e0ba09cbc73319a0c0"><li>非堆优化（线性查找）：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>堆优化（二叉堆）：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2819ea609df0a3275f3c1"><li>记录路径的算法示意：</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2819ea609df0a3275f3c1"></ul></ul></ol><li>所有顶点之间的最短路（Floyd）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bc89d7f691ca343178" style="list-style-type:decimal"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281da927ef2679d2e17c3"><li>可以处理负边，不能处理负圈。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e68bdaec36019c12b4"><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，空间复杂度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28122a013eee1d2f27475"><li>算法示意：</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28122a013eee1d2f27475"></ul></ul></ol></ol><li>活动网络</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815c9443d42c092f9a37" style="list-style-type:lower-roman"><li>AOV 网络（Activity On Vertex，用顶点表示活动的网络）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28152a6abdef83d186f24" style="list-style-type:decimal"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281379d97e4db9c2da856"><li>拓扑排序：不能存在有向环，时间复杂度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol><li>AOE 网络（Activity On Edges，用边表示活动的网络）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812a9c6df66ef788d802" style="list-style-type:decimal"><li>工程只存在<b>一个</b>开始点（源点）和结束点（汇点）。</li><li>“事件”指的是一个顶点，这个顶点一般有多条边，“活动”指的是一条边。事件开始，活动不一定开始，一个事件的多个活动可以在不同的时间开始。因此 [事件的最早开始时间] 指的是源点到该事件的最长路径，[活动的最早开始时间] 和 [事件的最早开始时间] 相同。事件的开始一定伴随着活动的开始，但不一定是所有活动开始。</li><li>算法：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815db949f63e0ced36ae" style="list-style-type:lower-alpha"><li>事件的最早开始时间：源点到该点的最长路径。简单起见，为 max(其所有前驱的最早开始时间 + 边长度)。</li><li>事件的最晚开始时间：min(其所有后继的最晚开始时间 - 边长度)</li><li>活动的最早开始时间：= 事件的最早开始时间</li><li>活动的最晚开始时间：&lt;i, j&gt; = <b>j 事件</b>最晚开始时间 - 边长度</li></ol><li>示例：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813eab25e2ea7af9d0d8" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28073a0decbbc1049b328"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5f3ba396-2aa3-46a6-8910-0c4be13fcfba%3Acp.png?table=block&amp;id=35fa9ed6-f2d2-8073-a0de-cbbc1049b328&amp;t=35fa9ed6-f2d2-8073-a0de-cbbc1049b328" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d28192b893ec37584eeb90" data-id="35fa9ed6f2d28192b893ec37584eeb90"><span><div id="35fa9ed6f2d28192b893ec37584eeb90" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28192b893ec37584eeb90" title="排序"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">排序</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28137a0b1c24b7a0a4d18" style="list-style-type:decimal"><li>插入排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28137a0b1c24b7a0a4d18" style="list-style-type:lower-alpha"><li>直接插入排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811f8ac7e1189ccb2674" style="list-style-type:lower-roman"><li>从第一个元素开始，将后面的元素插入前面元素形成的序列中。将每次插入的元素放入 temp 变量暂存（方便腾地方）。</li><li>稳定。适用于基本有序的序列。</li><li>时间复杂度：平均情况下，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><li>折半插入排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814aad40ca3e26eab9de" style="list-style-type:lower-roman"><li>直接插入的改进，利用序列的有序性进行折半查找。</li><li>稳定。</li><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><li>希尔排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bf9b5ff10451651acd" style="list-style-type:lower-roman"><li>逐渐缩小增量的分组插入排序。</li><li><b>不稳定</b>。</li><li>示例：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fa9160d15818f1471d" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2800f826dd7bde576abb7"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:336px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A9645c0b1-6e0e-42b8-88b4-9991a3e81b1c%3Ashellsort.png?table=block&amp;id=35fa9ed6-f2d2-800f-826d-d7bde576abb7&amp;t=35fa9ed6-f2d2-800f-826d-d7bde576abb7" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><li>快速排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28161a840e4f38ba4db88" style="list-style-type:lower-roman"><li>选一个 pivot，通常为第一个。维护一个 pivot pos 为 left。从第二个元素开始，每次发现比 pivot 小的元素（i），pivot pos ++，并交换 pivot pos 处的元素和 i 处的元素。最后将 pivot pos 处的元素和首位元素交换。并对两侧的序列递归操作。</li><li>不稳定。</li><li>时间复杂度：平均 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，最坏情况退化为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><li>选择排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b58a67c991fb8981c4" style="list-style-type:lower-roman"><li>直接选择排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819eadc2c1523319ea7e" style="list-style-type:decimal"><li>每次从后面的序列中选择一个最小的，和前面序列尾部元素交换。</li><li>不稳定。</li><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><li>锦标赛排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28194aaaec56087fa9e28" style="list-style-type:decimal"><li>胜者树：一棵完全二叉树。其中的叶结点是要排序的元素，非叶结点是两个子结点中胜者的代表。根节点代表着所有元素中的胜者。胜者树一般存放待排序元素的下标（当然如果元素足够基本，也可以直接存放元素）。</li><li>注：当某个叶子被标记为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 时，其兄弟直接上浮，这<b>不算</b>一次比较（与无穷比较不算比较，因为只需要看对方是否为无穷，并不需要真正比较）。</li><li>稳定。（相同元素，左边先出）</li><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。空间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol><li>堆排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281209ea4fd9665686a4c" style="list-style-type:decimal"><li>为了<b>从小到大</b>排序，需要建立<b>最大堆</b>。使得堆顶始终在数组的起始地址，便于维护堆。</li><li>不稳定。</li><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。空间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol></ol><li>归并排序</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a284d0ed88197f026f" style="list-style-type:lower-roman"><li>见图：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28165b2e9f017704cfe0d" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28078b39eeb559dc87d4f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Af5bbdfab-32b5-4539-96ab-e27fc5105c04%3Amergesort.png?table=block&amp;id=35fa9ed6-f2d2-8078-b39e-eb559dc87d4f&amp;t=35fa9ed6-f2d2-8078-b39e-eb559dc87d4f" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>稳定。</li><li>时间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。空间复杂度：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol><li>各种排序方法的比较</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281419ed0dba6b1cd54b6" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28043bce2d22621c3f26b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ac7ed21d5-3979-4480-bade-f02e8ce39f6d%3Asort.png?table=block&amp;id=35fa9ed6-f2d2-8043-bce2-d22621c3f26b&amp;t=35fa9ed6-f2d2-8043-bce2-d22621c3f26b" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2817491f5c757965c3b34" data-id="35fa9ed6f2d2817491f5c757965c3b34"><span><div id="35fa9ed6f2d2817491f5c757965c3b34" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2817491f5c757965c3b34" title="文件、外部排序与外部搜索"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">文件、外部排序与外部搜索</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2817a825ad688d9b2544b" style="list-style-type:decimal"><li>B 树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2817a825ad688d9b2544b" style="list-style-type:lower-alpha"><li>定义，m 阶 B 树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818b82d2caa825404597" style="list-style-type:lower-roman"><li>每个节点最多有 m-1 个关键码</li><li>根节点可以只有 1 个关键码</li><li>非根节点（不包括失败节点）至少有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个关键码（失败节点至少有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个）。</li><li>所有的叶节点（失败节点）都位于同一层。</li></ol><li>结论</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281248e4de1a4f5ea0957" style="list-style-type:lower-roman"><li>B 树<b>第 h 层</b>至少有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个节点。</li><li>树中关键码有 N 个，N + 1 = 失败节点数 = 位于 h + 1 层的节点数，N + 1 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> ，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol><li>插入</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28183a9eccf9826235c95" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f2a9b7e95fe0eb3b7a"><li>分裂操作：将第 m / 2 个元素当作新根，这个新根上移到父节点，新根的左右指针分别指向左、右两部分。</li></ul></ol><li>删除</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281df92d1e665889fb9fa" style="list-style-type:lower-roman"><li>若该节点不是叶节点，则用左子树最大或右子树最小来替换。</li><li>在叶节点上的删除</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28120a3efdd079c06be5a" style="list-style-type:decimal"><li>如果在根节点，或删除前关键码 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则直接删除。</li><li>如果删除前关键码数量 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，但是其兄弟关键码 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则将根下移作为删除节点的补充，从兄弟节点选一个作为新根。</li><li>如果删除前关键码数量和其兄弟的关键码数量均 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则需要合并这两个节点。合并时将父节点指针下移与两个节点合并为一个节点。然后向上检查，最坏情况必须检查到根节点。（保证失败节点都在一层，不在一层肯定不对）</li><li>图例：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bc9dbddec1ad9ab609" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2806fa9e3dae1d40c5ff6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A2ded7bbc-209a-4749-bc77-df05d039bab9%3Abtdel.png?table=block&amp;id=35fa9ed6-f2d2-806f-a9e3-dae1d40c5ff6&amp;t=35fa9ed6-f2d2-806f-a9e3-dae1d40c5ff6" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></ol></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cca5cddd05b006ed24" style="list-style-type:decimal"><li>B+ 树</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cca5cddd05b006ed24" style="list-style-type:lower-alpha"><li>区别：所有关键码都存放在叶结点中，上层的非叶结点的关键码是其子树中<b>最小（或最大）关键码的复写</b>。叶结点包含了全部关键码及指向相应数据记录存放地址的指针，且叶结点本身按关键码<b>从小到大</b>顺序<b>链接</b>。</li><li>定义：m 阶 B+ 树（最大关键码覆写）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281929273df9adc69db26" style="list-style-type:lower-roman"><li>每个节点最多 m 棵子树</li><li>根节点最少 1 棵子树，其他节点至少<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 棵子树。</li><li>所有叶节点在同一层，按从小到大的顺序排列。</li></ol><li>插入：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28185ad51cb8de504c6c7" style="list-style-type:lower-roman"><li>插入仅在叶节点上进行。每次插入都要检查是否超出 m 个。</li><li>若超出，则进行分裂。原则是左多右少。（左 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，右 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>）。分裂后将缺少的最大值<b>复制</b>一份放入根节点。</li><li>示例：4 阶 B+ 树，最大关键码覆写，插入 53, 63, 90, 88, 15, 10, 44, 68, 74</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281db8d8ce5067e6c4465" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2803cbb5afbd20ce3515c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A3b486763-5fab-4b7c-af51-e2777662c919%3Abptins.png?table=block&amp;id=35fa9ed6-f2d2-803c-bb5a-fbd20ce3515c&amp;t=35fa9ed6-f2d2-803c-bb5a-fbd20ce3515c" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2818b8454f9fe8845a811">提示：注意下面红色的箭头不要忘了。</div></ol></ol><li>删除</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c3960cdaf9c3b42ff2" style="list-style-type:lower-roman"><li>删除仅在叶节点上进行。若删除后关键码 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则直接删除。若删除的是最大节点，上层的副本<b>可以保留</b>。</li><li>若删除后关键码 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，但兄弟的关键码 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则把兄弟最左的拿来，并<b>修改上层</b>分界关键码的值。</li><li>如果兄弟的关键码已达下限，那么直接将左右兄弟合并。合并后会导致父节点的关键码数量减少，可能需要再进行合并。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810ba5c7e16f07088da1" style="list-style-type:decimal"><div class="notion-text notion-block-35fa9ed6f2d281c69f5fc9950487b624">注：第 2 条说的借兄弟的，可能借一个，也可能借一块，如下（根节点的右兄弟向左兄弟借了一块）：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280e19406d08fcf17716a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A865c3bd3-6fb0-4414-94d9-c26fc2282767%3Abrolend.png?table=block&amp;id=35fa9ed6-f2d2-80e1-9406-d08fcf17716a&amp;t=35fa9ed6-f2d2-80e1-9406-d08fcf17716a" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2813a93d0d514d7a98da9" data-id="35fa9ed6f2d2813a93d0d514d7a98da9"><span><div id="35fa9ed6f2d2813a93d0d514d7a98da9" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2813a93d0d514d7a98da9" title="往年卷"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">往年卷</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816283e6ff78a9965897" style="list-style-type:decimal"><li><b>长度有限</b>不是算法的基本特征.</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c29dffd898db847c38" style="list-style-type:decimal"><li>带有一个头结点 XX, 这个头结点不算 XX 中的元素. 也就是说, XX 为空等价于只有一个头结点.</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b8ae54caa4a6443e77" style="list-style-type:decimal"><li>一棵有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个结点的满二叉树共有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个叶子, <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 个非叶结点.</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fb831bcd86200395d2" style="list-style-type:decimal"><li>树的<b>后根遍历</b>序列等同于对该树对应的二叉树进行 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的序列</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b48c02dfbcc0188c50" style="list-style-type:decimal"><li>二叉树的遍历</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b48c02dfbcc0188c50" style="list-style-type:lower-alpha"><li>前序：根左右，中序：左根右，后序：左右根</li><li>前序与中序相同：空树（别忘了！）或左子树为空的单支树</li><li>中序与后序相同：空树或右子树为空的单支树</li><li>前序与后序相同：空树或只有根的树</li></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281048338df16c0f1576b" style="list-style-type:decimal"><li>并查集</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281048338df16c0f1576b" style="list-style-type:lower-alpha"><li>根据树高执行 union：每次都将矮树并到高树上</li><li>根据节点个数执行 union：每次都将节点少的树并到节点多的树上</li></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f9a7bedb08a5122c7f" style="list-style-type:decimal"><li>闭散列的线性探查法：ASL不成功的算式中，分数的分母是散列函数可计算的地址范围，非表长度。</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c4bff4e7322e2b4047" style="list-style-type:decimal"><li>线性探查法：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c4bff4e7322e2b4047" style="list-style-type:lower-alpha"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c0be31ea00fd3c9f9b" style="list-style-type:decimal"><li>筛选法建堆从<b>最后一个非叶子节点</b>开始。</li></ol></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[编译原理—期末笔记]]></title>
            <link>http://arys.top/article/compiler-final</link>
            <guid>http://arys.top/article/compiler-final</guid>
            <pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[详细介绍了编译原理的基础知识，包括南大计科编译原理一学期的教学内容，以及部分软院编译原理的内容。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d2807c8eeff9beed63ddec"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d280598ee2fd8cd0dae07e"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🗒️">🗒️</span></div><div class="notion-callout-text">这篇文章是南京大学计科 <span class="notion-yellow">编译原理</span><span class="notion-default"> 课程的期末复习笔记。由于笔者在大二上修读，比计划时间早了一年，是班级上唯一的 23 级学生，所以在这门课上的复习下了很大功夫。在学习过程中也线上学习了软院蚂蚁老师的 </span><a class="notion-link" href="http://docs.compilers.cpl.icu/#/" target="_blank" rel="noopener noreferrer">编译原理</a> 课程，十分有收获（同时痛恨自己知道蚂蚁太晚，没有在学习 C 语言时看 CPL 视频😭）。</div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281e8b2b6d8ee186dcfe5" data-id="35fa9ed6f2d281e8b2b6d8ee186dcfe5"><span><div id="35fa9ed6f2d281e8b2b6d8ee186dcfe5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281e8b2b6d8ee186dcfe5" title="英文缩写"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">英文缩写</span></span></h3><div class="notion-text notion-block-35fa9ed6f2d2817aa3e7c89466ea591b">题型：给英文缩写，要求写出全称 + 意思</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28144abcbfc6e9c09d7e5" style="list-style-type:decimal"><li>RE: Regular Expression，正则表达式。一种描述词素模式的表示方法。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28172b524f6ed31336af9" style="list-style-type:decimal"><li>NFA: Nondeterministic Finite Automaton，非确定性有限自动机。等价于状态转换图。NFA 允许非确定性和 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>转移。（NFA 由一个有穷状态集合 S，一个输入符号集合 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，和转换函数组成。S 中的一个状态 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 被指定为开始状态，S 的一个子集被指定为接受状态。）</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28195895fdf79ca9b7af5" style="list-style-type:decimal"><li>DFA: Deterministic Finite Automaton，确定性有限自动机。DFA 的状态转移规则都是明确的。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28180aeeacefd37664766" style="list-style-type:decimal"><li>CFG: Context Free Grammar，上下文无关文法。上下文无关指的是非终结符的推导和其前后串无关。由一个开始符号，终结符号，非终结符号和一组产生式构成。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819cb9dedf402ef84af2" style="list-style-type:decimal"><li>AST: Abstract Syntax Tree，抽象语法树。每个结点代表一个语法结构；对应于一个运算符。结点的每个子结点代表其子结构；对应于运算分量。</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cd83aae8c5b4b46c49" style="list-style-type:decimal"><li>DAG: Directed Acyclic Graph，有向无环图。指的是一个没有环的、有限的有向图。</li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28101816ecfc4947c7e65" style="list-style-type:decimal"><li>SSA: Static Single Assignment，静态单赋值。SSA 中的所有赋值都是针对不同名的变量。每个变量在生命周期内只被赋值一次，每次赋值都会创建一个新变量。</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a69b87ecf78d74f207" style="list-style-type:decimal"><li>SDD: Syntax Directed Definition，语法制导的定义，是对上下文无关文法的推广。将文法符号和一个语义属性集合关联，产生式和一组语义规则相关联。</li></ol><ol start="9" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810b9f85d702684a58af" style="list-style-type:decimal"><li>SDT: Syntax Directed Translation，语法制导的翻译，是在产生式体中嵌入程序片断（语义动作）的上下文无关文法。</li></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d28132a8acfa5e232fb4cf" data-id="35fa9ed6f2d28132a8acfa5e232fb4cf"><span><div id="35fa9ed6f2d28132a8acfa5e232fb4cf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28132a8acfa5e232fb4cf" title="词法分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">词法分析</span></span></h3><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28119b7e6ed2407a06f28"><li>题型：</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f79128d235ca4bf8a4" style="list-style-type:decimal"><li>根据描述写出正则表达式</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cfb763dde5a5cf4512" style="list-style-type:decimal"><li>画出状态转换图 NFA</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811c83f3d4b7f839548c" style="list-style-type:decimal"><li>NFA -&gt; DFA</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b59010f12d0305c673" style="list-style-type:decimal"><li>DFA 状态最小化</li></ol><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281ddb00cce920cadfd25"><li>考试注意</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2819b8a02f2e28e558901"><li>自动机开始状态要用<b>箭头 + start</b> 指出，接受状态画<b>两个圈</b>。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815faefde693ea773401"><li>状态转换图和 DFA 要给状态标号。</li></ul><div class="notion-text notion-block-35fa9ed6f2d281878095de006eda9d56">例：(<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> | b)*ab)* 完成后三步</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28148a91afb50f4184d30" style="list-style-type:decimal"><li>正则 -&gt; NFA，按照 Thompson 构造法的三种模式。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28148a91afb50f4184d30" style="list-style-type:lower-alpha"><div class="notion-text notion-block-35fa9ed6f2d281958526e2692ac75473">或操作（新建两个状态）：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281acb8d3e1d7be36e21d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A1da9a8cb-0c90-494c-b744-ea7e1206be9d%3A1da9a8cb-0c90-494c-b744-ea7e1206be9d.png?table=block&amp;id=35fa9ed6-f2d2-81ac-b8d3-e1d7be36e21d&amp;t=35fa9ed6-f2d2-81ac-b8d3-e1d7be36e21d" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28193b007f906e26aa77f">连接操作（直接并在一起）：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28121ac3fc4a71da74ebf"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3Af0085b63-656c-4027-b52a-c7c2d7ddc9c1%3Af0085b63-656c-4027-b52a-c7c2d7ddc9c1.png?table=block&amp;id=35fa9ed6-f2d2-8121-ac3f-c4a71da74ebf&amp;t=35fa9ed6-f2d2-8121-ac3f-c4a71da74ebf" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28179a7cec07f947de441">闭包（新建两个状态，两个 epsilon 转移）：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28193b801d474b4ec6d00"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3Ab3e87c7b-2aff-4d78-9844-7c8e1689775e%3Ab3e87c7b-2aff-4d78-9844-7c8e1689775e.png?table=block&amp;id=35fa9ed6-f2d2-8193-b801-d474b4ec6d00&amp;t=35fa9ed6-f2d2-8193-b801-d474b4ec6d00" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a694d5c0247c161e52" style="list-style-type:decimal"><li>NFA 的转换函数：用语言描述为 “状态 0 接受 a 转换到状态 0, 1”，<code class="notion-inline-code">(0, a) -&gt; {0, 1}</code></li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a4b605dcde5f5ce046" style="list-style-type:decimal"><li>NFA -&gt; DFA：子集构造法。一开始 DFA 的 states 中只有一个 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>closure(s0)，对 states 中的每一个状态，都求出对每一个输入字符 c 的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>closure(move(T, c))，如果在此过程中产生了新的状态，则加入 states。最后所有的状态经过每个字符都能到达 states 中一个确定的状态。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281759156dcc7291b9d28" style="list-style-type:decimal"><li>DFA 最小化。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b6b0a9da7833d8e1c5" style="list-style-type:decimal"><li>算法：从原理上讲，先将状态集合分为两个：结束状态和其他状态，然后再假设某两个状态相同，看有没有一个输入可以区分它们。如果在所有输入下这些状态要么回到自身的集合，要么到达相同的集合，那么它们等价。</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bb9094f286c1c4e214" style="list-style-type:decimal"><li>对最小化的 DFA 来说，开始状态即为有开始状态的那个组，结束状态即为有结束状态的那个组。</li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28144a00ecbe993afcc9e" style="list-style-type:decimal"><li>做题时直接瞪眼看出哪两个状态是等价的，然后再试图证明。</li></ol><div class="notion-text notion-block-35fa9ed6f2d281ffbad4f3da830749b4">例题：由字符 ‘a’, ‘b’ 组成的，不含连续两个 ‘a’ 的字符串。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2816aaf11cb88ae555402" data-id="35fa9ed6f2d2816aaf11cb88ae555402"><span><div id="35fa9ed6f2d2816aaf11cb88ae555402" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2816aaf11cb88ae555402" title="语法分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">语法分析</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281a198cdf0914af5505e" data-id="35fa9ed6f2d281a198cdf0914af5505e"><span><div id="35fa9ed6f2d281a198cdf0914af5505e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281a198cdf0914af5505e" title="消除左递归"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">消除左递归</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281558ad7ee6bf1627bfa"><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 消除立即左递归</div><div class="notion-text notion-block-35fa9ed6f2d2816ea363c9f92f6afaa1">公式：重要！！不要忘记 A’ 这个一撇和 epsilon ！！</div><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d281969352e7e512455def">推广：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281bba46ade7b2ab8a011"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ab018b27f-867c-43a3-8322-63c37c6f3610%3Ab018b27f-867c-43a3-8322-63c37c6f3610.png?table=block&amp;id=35fa9ed6-f2d2-81bb-a46a-de7b2ab8a011&amp;t=35fa9ed6-f2d2-81bb-a46a-de7b2ab8a011" alt="notion image" loading="lazy" decoding="async"/></div></figure><hr class="notion-hr notion-block-35fa9ed6f2d281cabb35c05bcc2fd6e0"/><div class="notion-text notion-block-35fa9ed6f2d281a0a872cb96d3ef6bb3">消除多步左递归</div><div class="notion-text notion-block-35fa9ed6f2d28142a028c8b2b0d99ab7">判断方法：给非终结符号排序。原理上可以任意排序，实际操作时一般按照从开始符号推导的顺序排序，这样在下一步时只需要看靠右的能否推导出靠左的即可。考试时最多迭代两次。</div><div class="notion-text notion-block-35fa9ed6f2d2818e9f83d432e837a4f6">消除方法：替换并消除。注意！！替换时要<b>全部</b>替换！无论产生式有没有产生左递归，都要替换。</div><div class="notion-text notion-block-35fa9ed6f2d281b3b94dd34872bb66be">例子：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28190aa14cde87253512d"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A8aefa689-c269-4158-8ca1-5eb950ca27b8%3A8aefa689-c269-4158-8ca1-5eb950ca27b8.jpg?table=block&amp;id=35fa9ed6-f2d2-8190-aa14-cde87253512d&amp;t=35fa9ed6-f2d2-8190-aa14-cde87253512d" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281f29246ecee25f23546" data-id="35fa9ed6f2d281f29246ecee25f23546"><span><div id="35fa9ed6f2d281f29246ecee25f23546" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281f29246ecee25f23546" title="提取左公因子"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">提取左公因子</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281269546e2fad257a53c">找出可选项中的<b>最长公共前缀</b>。注意！！如果有一个产生式就是那个公因子，则<b>不能遗忘 epsilon</b> ！！！</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281188a40e8c114932864"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A139e39ad-7e81-4c93-ae00-ccd7f153b347%3A139e39ad-7e81-4c93-ae00-ccd7f153b347.png?table=block&amp;id=35fa9ed6-f2d2-8118-8a40-e8c114932864&amp;t=35fa9ed6-f2d2-8118-8a40-e8c114932864" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28173b278e26622301d04" data-id="35fa9ed6f2d28173b278e26622301d04"><span><div id="35fa9ed6f2d28173b278e26622301d04" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28173b278e26622301d04" title="预测分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">预测分析</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d28194b2d8c1f2afe6c7f6">FIRST(<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>) 集合：可以从 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 推导得到的串的首符号的集合。方法：不断展开直到开头为终结符。计算方法：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281388071ff5178103c20"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:624px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Add60bfcb-5c67-4bf3-9161-77df9741aec4%3Add60bfcb-5c67-4bf3-9161-77df9741aec4.png?table=block&amp;id=35fa9ed6-f2d2-8138-8071-ff5178103c20&amp;t=35fa9ed6-f2d2-8138-8071-ff5178103c20" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2811c8ff0c54f66956dd7">FOLLOW(A) 集合：可能在某些句型中紧跟在 A 后面的终结符号。计算方法：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2811ba47ef7adff3026ff"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:624px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ade1fad2d-f711-4bee-a122-79053567f363%3Ade1fad2d-f711-4bee-a122-79053567f363.png?table=block&amp;id=35fa9ed6-f2d2-811b-a47e-f7adff3026ff&amp;t=35fa9ed6-f2d2-811b-a47e-f7adff3026ff" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28138a4d6cd6427e4bd7d">注意：FIRST 和 FOLLOW 集合均为终结符号！两个例外：若 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 可推导出 epsilon，则 epsilon 在 FIRST(<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>) 中；FOLLOW(开始符号) 含有 $，如果 A 是某些句型的<em>最右符号</em>，那么 $ 在 FOLLOW(A) 中。</div><div class="notion-text notion-block-35fa9ed6f2d281d883fbc3a61d010434">要点：先写 FIRST 再写 FOLLOW，由 FIRST 推 FOLLOW。</div><hr class="notion-hr notion-block-35fa9ed6f2d281eea5d8c860d3d33a4d"/><div class="notion-text notion-block-35fa9ed6f2d281018adbeda24e44319d">预测分析表</div><div class="notion-text notion-block-35fa9ed6f2d281f08294d44a6854d56b">构造方法：如果 t 在 FIRST(A) 中或者 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 且 t 在 FOLLOW(A) 中，则在 <code class="notion-inline-code">table[A][t]</code> 中填入 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></div><div class="notion-text notion-block-35fa9ed6f2d281dfabcbd18b3c1b12aa">出错的格子留空即可（或者填 Error，但是要填就都要填上，不如留空）</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281f698bce777072b5df1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3Adfce7d64-668d-40de-8529-70e6685f3041%3Adfce7d64-668d-40de-8529-70e6685f3041.png?table=block&amp;id=35fa9ed6-f2d2-81f6-98bc-e777072b5df1&amp;t=35fa9ed6-f2d2-81f6-98bc-e777072b5df1" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28187a304ef860030ee61">LL(1) 文法：预测表中每个条目都唯一地指定了一个产生式，或者标明 Error。</div><div class="notion-text notion-block-35fa9ed6f2d281f89efde3c10ac4ecef">非 LL(1) 文法或二义性文法：一个条目中有多个产生式。</div><div class="notion-text notion-block-35fa9ed6f2d281689920db124183ee98">重写非 LL1 文法使其变为 LL1：不断进行提取左公因子和消除左递归的过程。</div><hr class="notion-hr notion-block-35fa9ed6f2d281058f52cd547bd7d751"/><div class="notion-text notion-block-35fa9ed6f2d2814aaf78d32e7927d810">句柄是<b>最右推导的反向过程</b>中被规约的部分。</div><div class="notion-text notion-block-35fa9ed6f2d2814bab60f05dc491b06d">在移入 / 归约分析框架中，句柄始终出现在栈顶。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2819f8056ebc295ba1fe6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ab672ed16-0059-46d5-b7bf-fd3ad1973a4f%3Ab672ed16-0059-46d5-b7bf-fd3ad1973a4f.jpg?table=block&amp;id=35fa9ed6-f2d2-819f-8056-ebc295ba1fe6&amp;t=35fa9ed6-f2d2-819f-8056-ebc295ba1fe6" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281a99433c11c6ec5925d">移入 / 归约冲突：栈中的内容和接下来的k个输入符号，都不能确定进行移入还是归约操作（不能确定是否是句柄）。</div><div class="notion-text notion-block-35fa9ed6f2d281b298c6f6d171e67d93">归约 / 归约冲突：存在多个可能的归约到不同非终结符号的归约（不能确定句柄归约到哪个非终结符号）。</div><hr class="notion-hr notion-block-35fa9ed6f2d28100ae59f678f71b6d4d"/><div class="notion-text notion-block-35fa9ed6f2d281f08fedc0aef2322140">规范 LR(0) 项集族的构造</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281bb962ee24c90c63feb"><li>增广文法：G 的增广文法 G’ 是在 G 中增加新开始符号 S’，并加入产生式 <b>S’-&gt;S</b> 而得到的</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28162b9b9eb2091f90058"><li>子函数：CLOSURE(I)：I 的项集闭包（对应 DFA 化算法的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>closure）。GOTO(I,X)：I 的 X 后继（对应 DFA 化算法的 MOVE(I,X)）。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28194a048f9468d44b6ac"><li>内核项：初始项 S’ -&gt; ·S 以及所有点不在最左边的项。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810597f7ee79bb975b80"><li>非内核项：除了 S’ -&gt; ·S 所有点在最左边的项。</li></ul><div class="notion-text notion-block-35fa9ed6f2d2818c8ddecaf3c7c61895">例：根据以下产生式，给出 LR(0) 项集规范族。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28102b40fc4d4d5094d33"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:192px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A45d6147d-22bf-4248-a821-a430b4e49ac3%3A45d6147d-22bf-4248-a821-a430b4e49ac3.png?table=block&amp;id=35fa9ed6-f2d2-8102-b40f-c4d4d5094d33&amp;t=35fa9ed6-f2d2-8102-b40f-c4d4d5094d33" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2811490bfd3ecba431ad7"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A51991a0b-15c5-40c4-a21c-433ede5dfd35%3A51991a0b-15c5-40c4-a21c-433ede5dfd35.png?table=block&amp;id=35fa9ed6-f2d2-8114-90bf-d3ecba431ad7&amp;t=35fa9ed6-f2d2-8114-90bf-d3ecba431ad7" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281e4bc7aec0ae0a18ea0">灰色部分（非内核项，CLOSURE）的构造：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28148a873d6cea5a62e98"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:624px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A74667d61-e5e7-454e-874b-9e4c5cc5903b%3A74667d61-e5e7-454e-874b-9e4c5cc5903b.png?table=block&amp;id=35fa9ed6-f2d2-8148-a873-d6cea5a62e98&amp;t=35fa9ed6-f2d2-8148-a873-d6cea5a62e98" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28103ac58d11b7cf0b9f8">注：非内核项的点在最左边。</div><hr class="notion-hr notion-block-35fa9ed6f2d281b289b8f8a6668d9d3b"/><div class="notion-text notion-block-35fa9ed6f2d281cd8e6bc7383492bdfc">SLR 语法分析表的构造</div><div class="notion-text notion-block-35fa9ed6f2d281629b2cf2629c1542f3">ACTION 全是终结符号。s5 表示移入状态 5，r5 表示<b>利用第 5 条产生式归约</b>。GOTO 全是非终结符号，1 表示去到第 1 个状态。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2813aa54af8cefe17ab57"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aceb5668d-4b17-4831-9195-1778ddbd172a%3Aceb5668d-4b17-4831-9195-1778ddbd172a.png?table=block&amp;id=35fa9ed6-f2d2-813a-a54a-f8cefe17ab57&amp;t=35fa9ed6-f2d2-813a-a54a-f8cefe17ab57" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2811da68fdfbd7cea9608">构造方法：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281019c22d58cba6f57fc"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:672px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A9bbc5ed0-cf45-45bc-a871-855fb630b889%3A9bbc5ed0-cf45-45bc-a871-855fb630b889.png?table=block&amp;id=35fa9ed6-f2d2-8101-9c22-d58cba6f57fc&amp;t=35fa9ed6-f2d2-8101-9c22-d58cba6f57fc" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28127bb4cda7d5e22b77b">即：点右边有东西就填入 sX。点右边没东西就在 FOLLOW(A) 填入 rX，如果 A 是增广文法的 S’，则填入 acc。</div><div class="notion-text notion-block-35fa9ed6f2d281b7a592d8d9f789db3a">例题：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28189ad68e36d83bf31e1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A522513cc-b603-44bd-8211-ada5575d0986%3A522513cc-b603-44bd-8211-ada5575d0986.png?table=block&amp;id=35fa9ed6-f2d2-8189-ad68-e36d83bf31e1&amp;t=35fa9ed6-f2d2-8189-ad68-e36d83bf31e1" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2818eba37d5ef845d2626" data-id="35fa9ed6f2d2818eba37d5ef845d2626"><span><div id="35fa9ed6f2d2818eba37d5ef845d2626" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2818eba37d5ef845d2626" title="语法制导的翻译"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">语法制导的翻译</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28151ba6fd98bc82fbd99" data-id="35fa9ed6f2d28151ba6fd98bc82fbd99"><span><div id="35fa9ed6f2d28151ba6fd98bc82fbd99" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28151ba6fd98bc82fbd99" title="注释语法分析树"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">注释语法分析树</span></span></h4><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281cf8010e27ce2c33b08"><li>综合属性：分析树上非终结符号的属性值由<b>子节点及本身</b>的属性值来定义。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d7bfd7ce61748ebca0"><li>继承属性：依赖于父节点、本身和兄弟节点（一般是左侧）的属性值。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d6affcd22bbd7ac7d3"><li>终结符号<b>都是</b>综合属性，从词法分析获得。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281b4bd3df63815617b10"><li>S 属性的 SDD：只含综合属性。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28132a802fd0d6dde2542"><li>L 属性的 SDD：既有综合属性，又有继承属性。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d8af1ff15785474ed6"><li>注释语法分析树：包含各个节点的<b>各属性值</b>（全部属性值）的语法分析树。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f7bf5bf83df1664185"><li>依赖图：描述了某棵特定的分析树上各个属性实例之间的信息流（计算顺序）。</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f7bf5bf83df1664185"><div class="notion-text notion-block-35fa9ed6f2d281f2b75ffa6c4eaf476b">例子：给出如下的产生式和语义规则，画出 3*5+4<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的依赖图（<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 表示结束）。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28157b24dd8a9495f9749"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ab3fa1d7d-0970-4319-a6de-bca0601e17d5%3Ab3fa1d7d-0970-4319-a6de-bca0601e17d5.png?table=block&amp;id=35fa9ed6-f2d2-8157-b24d-d8a9495f9749&amp;t=35fa9ed6-f2d2-8157-b24d-d8a9495f9749" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28189b276eadfcea3ca06"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A1d85d517-6816-4364-8b40-6269d7790393%3A1d85d517-6816-4364-8b40-6269d7790393.png?table=block&amp;id=35fa9ed6-f2d2-8189-b276-eadfcea3ca06&amp;t=35fa9ed6-f2d2-8189-b276-eadfcea3ca06" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281128ed7e12f76c6916f">注：上图中把箭头去掉便是注释语法分析树。依赖图更多在既有综合属性又有继承属性的注释语法分析树中用到，例如：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281418a9de80f8d6017b3"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:576px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A4f5dcfd2-6ac0-4590-8c37-77054a5599ed%3A4f5dcfd2-6ac0-4590-8c37-77054a5599ed.png?table=block&amp;id=35fa9ed6-f2d2-8141-8a9d-e80f8d6017b3&amp;t=35fa9ed6-f2d2-8141-8a9d-e80f8d6017b3" alt="notion image" loading="lazy" decoding="async"/></div></figure></ul></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281cf80f6e2065eaf3f33" data-id="35fa9ed6f2d281cf80f6e2065eaf3f33"><span><div id="35fa9ed6f2d281cf80f6e2065eaf3f33" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281cf80f6e2065eaf3f33" title="设计 SDT"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">设计 SDT</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281478fc5e13afbedad12">题型：给定一个含左递归的产生式，化为自顶向下可以分析的 SDD（提取左公因子，消除左递归），画出依赖图。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281408086eb1618d78fa1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:336px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A127dc88e-d312-4b5d-87b0-395f3bba7313%3A127dc88e-d312-4b5d-87b0-395f3bba7313.png?table=block&amp;id=35fa9ed6-f2d2-8140-8086-eb1618d78fa1&amp;t=35fa9ed6-f2d2-8140-8086-eb1618d78fa1" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281c29ca1df9c4142b0de"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5ece41bf-0de8-4a51-a1eb-6cc96c5fe0ba%3A5ece41bf-0de8-4a51-a1eb-6cc96c5fe0ba.png?table=block&amp;id=35fa9ed6-f2d2-81c2-9ca1-df9c4142b0de&amp;t=35fa9ed6-f2d2-81c2-9ca1-df9c4142b0de" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28143b871e990de0f635c">注意：记得用<b>数字下标</b>来区别一个产生式中相同的终结符！！第一个产生式（增广）可以没有。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2810eb636c92c466bc696" data-id="35fa9ed6f2d2810eb636c92c466bc696"><span><div id="35fa9ed6f2d2810eb636c92c466bc696" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2810eb636c92c466bc696" title="后缀 SDT 的栈的实现"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">后缀 SDT 的栈的实现</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2811c9e2fe9b0d428f2cb">题型：基于栈写出对应 S 属性的 SDD 的动作，注意 top 减去的值。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2815d932de2be402ee705"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:576px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Acdc1e579-cb94-4a6d-b654-3e90ba811954%3Acdc1e579-cb94-4a6d-b654-3e90ba811954.png?table=block&amp;id=35fa9ed6-f2d2-815d-932d-e2be402ee705&amp;t=35fa9ed6-f2d2-815d-932d-e2be402ee705" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2817182fbf7e066ab04d1">E -&gt; E1 + T 中的 top - 2 是因为运算符在栈中，= 左边的 top-2 对应 E（归约后），= 右边的 top-2 对应 E1。F -&gt; ( E ) 的 top - 2 是因为被归约后 F 在 ‘(’ 的位置，就是 top-2。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2812998d1c563d5fdebbf" data-id="35fa9ed6f2d2812998d1c563d5fdebbf"><span><div id="35fa9ed6f2d2812998d1c563d5fdebbf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2812998d1c563d5fdebbf" title="SDD -&gt; SDT"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">SDD -&gt; SDT</span></span></h4><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815281a4cb437458f018"><li>题型：给一段语言描述，将动作嵌入 SDD 中。或给出一个 L 属性的 SDD，转换为 SDT。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e79ed1fcd08e747fe9"><li>做法：</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d698f0e8ab97245f0e"><li>判断 SDD 中各属性是综合属性还是继承属性（即判断是S属性还是L属性）。</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d698f0e8ab97245f0e"></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281c3a0a6dc86567a79e1"><li>然后<b>画流程图</b>（这一步是关键，这步做对了后面不容易错）。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2818c913eedffae144213"><li>综合属性 -&gt; 最右边, 继承属性 -&gt; 紧挨着非终结符号的左边。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281688a93c0d26fe8dd9d"><li>S.next = B 不能出现，左边是标签右边是非终结符不能赋值，解决办法：S.next = newlabel()，… || label(S.next) || B || …</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281688a93c0d26fe8dd9d"></ul></ul><div class="notion-text notion-block-35fa9ed6f2d281708525cdb96fa990d4">注意：<b>语义规则</b>即 SDD 不需要写出动作嵌入的位置，而 <b>SDT</b> 需要写出动作嵌入的位置。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28178b768f25cd041944b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aa7e8ff8a-3892-4144-ad9d-1f168b676f99%3Aa7e8ff8a-3892-4144-ad9d-1f168b676f99.jpg?table=block&amp;id=35fa9ed6-f2d2-8178-b768-f25cd041944b&amp;t=35fa9ed6-f2d2-8178-b768-f25cd041944b" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2813c871bc0cd01434bce"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ac2f9e8c8-8dbe-4fa5-9d03-07072cbf0ed4%3Ac2f9e8c8-8dbe-4fa5-9d03-07072cbf0ed4.jpg?table=block&amp;id=35fa9ed6-f2d2-813c-871b-c0cd01434bce&amp;t=35fa9ed6-f2d2-813c-871b-c0cd01434bce" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28171baa4f1d17c819626">判断是否可以 <code class="notion-inline-code">在LL或LR分析过程中实现</code> ？</div><div class="notion-text notion-block-35fa9ed6f2d281ec9031eb3b4394ab19">如果一个 <b>L 属性的 SDD 的基本文法可以使用 LL 分析技术</b>，那么它的 SDT 可以在 LL 或者 LR 语法分析过程中实现；</div><div class="notion-text notion-block-35fa9ed6f2d281418229f8851969da76">递归下降方法实现 L 属性的 SDD：</div><div class="notion-text notion-block-35fa9ed6f2d281849647c32cc61ef4e8">方法：先声明需要用到的变量，然后按照 SDT 的顺序书写代码即可。记得最后要 return 回放在式子最右端的 S.code</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28192a60ad44a7a6d6f82"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A1ef0c3ae-64cc-4afd-9887-948e473616dc%3A1ef0c3ae-64cc-4afd-9887-948e473616dc.png?table=block&amp;id=35fa9ed6-f2d2-8192-a60a-d44a7a6d6f82&amp;t=35fa9ed6-f2d2-8192-a60a-d44a7a6d6f82" alt="notion image" loading="lazy" decoding="async"/></div></figure><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281c18683f5e5f8bad124" data-id="35fa9ed6f2d281c18683f5e5f8bad124"><span><div id="35fa9ed6f2d281c18683f5e5f8bad124" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281c18683f5e5f8bad124" title="中间代码生成"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">中间代码生成</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28192a062db8a16c4b6e0" data-id="35fa9ed6f2d28192a062db8a16c4b6e0"><span><div id="35fa9ed6f2d28192a062db8a16c4b6e0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28192a062db8a16c4b6e0" title="有向无环图"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">有向无环图</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281d9af34f11a004ca005">题型：用 DAG 表示一个中缀表达式</div><div class="notion-text notion-block-35fa9ed6f2d28121aa4ee54be27cd32f">注意：除了复用表达式之外，<b>原子节点</b>（例如这里的 ‘a’）也需要复用。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2813f9d05c2a8fe81d036"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:336px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A4973ebfb-81ac-4069-a08f-c1079c2eaa72%3A4973ebfb-81ac-4069-a08f-c1079c2eaa72.png?table=block&amp;id=35fa9ed6-f2d2-813f-9d05-c2a8fe81d036&amp;t=35fa9ed6-f2d2-813f-9d05-c2a8fe81d036" alt="notion image" loading="lazy" decoding="async"/></div></figure><hr class="notion-hr notion-block-35fa9ed6f2d2811eb12aca748b2cbc8e"/><div class="notion-text notion-block-35fa9ed6f2d281828d7ced1bb4a49e89">基本块的 DAG</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281b699a5c41417237ea6"><li>题型：给出一段含数组的代码，要求画出数组引用的 DAG。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2813aa848d5ab92015186"><li>方法：图中只画 = 右边的式子，根节点为操作符，= 左边的左值写在根节点旁边。[]= 操作符有<b>3个操作数</b>，因为它的左值没法用一个变量表示，这三个操作数从左往右分别是：数组，下标，右值。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28109aff1f24f593e1183"><li>注意</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e2b8b0ce449555343c"><li>对数组 a 的元素赋值，杀死<b>所有</b>依赖于 a 的变量。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810dab15f49659b71a34"><li>如果出现对同一个元素的多次赋值，需要<b>用下标区分</b>！</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281b5a411c9848205c887"><li>对指针赋值，杀死前面所有的变量。</li></ul><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2814f99d5f148f36a6403"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A0aa34dce-232b-4094-8271-09c404b11020%3A0aa34dce-232b-4094-8271-09c404b11020.png?table=block&amp;id=35fa9ed6-f2d2-814f-99d5-f148f36a6403&amp;t=35fa9ed6-f2d2-814f-99d5-f148f36a6403" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28131b58deceb70f63608"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A0eee4ca9-ef10-49df-921d-b9ad06785d30%3A0eee4ca9-ef10-49df-921d-b9ad06785d30.png?table=block&amp;id=35fa9ed6-f2d2-8131-b58d-eceb70f63608&amp;t=35fa9ed6-f2d2-8131-b58d-eceb70f63608" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28174aa0dd71e0d08da0a">注意：如果特意强调“XX 变量在基本块出口处活跃”，那么说明考察知识点为<b>重组基本块</b>，原则是：尽量将公共子表达式的结果赋值给<b>活跃的变量</b>。可以删除赋值。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2816ca0a5f3cab81b4376"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Acd4a0b1c-dbc6-4fb3-95ef-036b62ac2199%3Acd4a0b1c-dbc6-4fb3-95ef-036b62ac2199.png?table=block&amp;id=35fa9ed6-f2d2-816c-a0a5-f3cab81b4376&amp;t=35fa9ed6-f2d2-816c-a0a5-f3cab81b4376" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281b9ba4fd541f403cd99" data-id="35fa9ed6f2d281b9ba4fd541f403cd99"><span><div id="35fa9ed6f2d281b9ba4fd541f403cd99" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281b9ba4fd541f403cd99" title="三元式"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">三元式</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2816e80fdf39247aea050">题型：给出一个表达式，填三元式的表。</div><div class="notion-text notion-block-35fa9ed6f2d28104bc3ce1894fbfaf44">易忘点：用编号引用一个式子的结果。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2815690dfd382426c156a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:576px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aeb36501a-2d8f-4434-a102-a4569f864bba%3Aeb36501a-2d8f-4434-a102-a4569f864bba.png?table=block&amp;id=35fa9ed6-f2d2-8156-90df-d382426c156a&amp;t=35fa9ed6-f2d2-8156-90df-d382426c156a" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28184a734cf5bb6a5cbf4" data-id="35fa9ed6f2d28184a734cf5bb6a5cbf4"><span><div id="35fa9ed6f2d28184a734cf5bb6a5cbf4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28184a734cf5bb6a5cbf4" title="回填"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">回填</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d28162878ac99980c69942">记住：M 在 S 的<b>前面</b>。<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 时将 M.instr 设置为下一条指令的地址。</div><div class="notion-text notion-block-35fa9ed6f2d2814da3f4fe550b291d4a">回填：truelist 和 falselist 中记录的是需要填写的<b>指令</b>地址，backpatch 函数是将该 list 中的所有指令填上 M.instr。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2814393f5f41a436d5b73"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Afb10aab5-dee7-45fd-afcc-cf67fec611c3%3Afb10aab5-dee7-45fd-afcc-cf67fec611c3.png?table=block&amp;id=35fa9ed6-f2d2-8143-93f5-f41a436d5b73&amp;t=35fa9ed6-f2d2-8143-93f5-f41a436d5b73" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2812fa34af4482cf910bb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Acf12e52e-3cbc-4d4f-967e-1dffa10e681e%3Acf12e52e-3cbc-4d4f-967e-1dffa10e681e.png?table=block&amp;id=35fa9ed6-f2d2-812f-a34a-f4482cf910bb&amp;t=35fa9ed6-f2d2-812f-a34a-f4482cf910bb" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281a59a46cdbe5e33b919" data-id="35fa9ed6f2d281a59a46cdbe5e33b919"><span><div id="35fa9ed6f2d281a59a46cdbe5e33b919" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281a59a46cdbe5e33b919" title="SSA"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">SSA</span></span></h4><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281378ecbff646f4aacbc"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aec5027e2-d0cb-4a6c-b326-b2786f1e66fe%3Aec5027e2-d0cb-4a6c-b326-b2786f1e66fe.png?table=block&amp;id=35fa9ed6-f2d2-8137-8ecb-ff646f4aacbc&amp;t=35fa9ed6-f2d2-8137-8ecb-ff646f4aacbc" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28146a239e3ecb9cd0d90">注意：三地址码转换为 SSA 不仅要加下标，而且记得在标签处（即控制流合并处）添加 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 函数。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281beb45fc6cfb5f327a1" data-id="35fa9ed6f2d281beb45fc6cfb5f327a1"><span><div id="35fa9ed6f2d281beb45fc6cfb5f327a1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281beb45fc6cfb5f327a1" title="运行时环境"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">运行时环境</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28125b69beb2a2adb1aac" data-id="35fa9ed6f2d28125b69beb2a2adb1aac"><span><div id="35fa9ed6f2d28125b69beb2a2adb1aac" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28125b69beb2a2adb1aac" title="活动记录"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">活动记录</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2811da5c0e9f8d2635b4e">题型：给出一段函数，求运行到某条代码时的堆、栈，要求标明变量名和值。</div><div class="notion-text notion-block-35fa9ed6f2d281debeacdc6b6d0174b5">活动记录的内容：实参，返回值，控制链，访问链，保存的机器状态，局部数据，临时变量。（7 个）</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28108a379e3b65c3027fa"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A540aa22b-85db-4651-b61e-f89ad24b3c8f%3A540aa22b-85db-4651-b61e-f89ad24b3c8f.png?table=block&amp;id=35fa9ed6-f2d2-8108-a379-e3b65c3027fa&amp;t=35fa9ed6-f2d2-8108-a379-e3b65c3027fa" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281f5965bf6195db91ad7">坑点：如果函数中有一句 <code class="notion-inline-code">static int x = 0;</code> 那么变量 <code class="notion-inline-code">x</code> 在静态数据区中，和 <code class="notion-inline-code">m</code> 在一起。（静态数据区存放静态变量和全局变量）</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281d88ef0deb97af4e2a1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A6eb7c767-7179-4b9e-8601-a7d19a23635b%3A6eb7c767-7179-4b9e-8601-a7d19a23635b.png?table=block&amp;id=35fa9ed6-f2d2-81d8-8ef0-deb97af4e2a1&amp;t=35fa9ed6-f2d2-81d8-8ef0-deb97af4e2a1" alt="notion image" loading="lazy" decoding="async"/></div></figure><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d28198ad1dddb4c356f8b1" data-id="35fa9ed6f2d28198ad1dddb4c356f8b1"><span><div id="35fa9ed6f2d28198ad1dddb4c356f8b1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28198ad1dddb4c356f8b1" title="引用计数和垃圾回收"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">引用计数和垃圾回收</span></span></h4><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28143b353f73aa7150759"><li>题型：引用计数，画图。注意：leak 的变量不能删除，只删除指向的边即可。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f2ab68cc61619b2f97"><li>标记-清扫式垃圾回收</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2816eb0e5eb47c8d38757"><li>标记：从根集开始，跟踪并标记出所有可达对象。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281c09730f4ab54888a1a"><li>清扫：遍历整个堆区，释放不可达对象。</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281a1a07df8f399b529f5" data-id="35fa9ed6f2d281a1a07df8f399b529f5"><span><div id="35fa9ed6f2d281a1a07df8f399b529f5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281a1a07df8f399b529f5" title="代码生成"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">代码生成</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281bdb9b2c697c8b60802" data-id="35fa9ed6f2d281bdb9b2c697c8b60802"><span><div id="35fa9ed6f2d281bdb9b2c697c8b60802" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281bdb9b2c697c8b60802" title="基本块和流图（必考）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">基本块和流图（必考）</span></span></h4><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2816aaa64d91499142146"><li>题型：三地址 -&gt; 基本块 -&gt; 流程图（Entry and Exit 节点）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281b3a595c30fc94de41f"><li>基本块划分的方法：</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f1992af499f563569e"><li>寻找首指令：第一条指令；跳转指令的目标指令；跳转指令的下一条指令</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d19be1d4d8125131a8"><li>划分基本块：[第一条首指令，下一条首指令)</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e0b968f8fe18460b29"><li>写出<b>入口 Entry 和出口 Exit</b>！！</li></ul><div class="notion-text notion-block-35fa9ed6f2d281b09e60d446fe6657cd">例题：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281cbbd7bd9659aede44f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A13326ff1-4df8-40db-ac58-b6118467dc96%3A13326ff1-4df8-40db-ac58-b6118467dc96.png?table=block&amp;id=35fa9ed6-f2d2-81cb-bd7b-d9659aede44f&amp;t=35fa9ed6-f2d2-81cb-bd7b-d9659aede44f" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28194a24ad47f06290e79"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A116e45e0-be3a-48b1-b509-f67f2471d787%3A116e45e0-be3a-48b1-b509-f67f2471d787.png?table=block&amp;id=35fa9ed6-f2d2-8194-a24a-d47f06290e79&amp;t=35fa9ed6-f2d2-8194-a24a-d47f06290e79" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28182bc6ad02611afa3d4">注意：这个流图不完整，需要加上入口 Entry 和出口 Exit。</div><div class="notion-text notion-block-35fa9ed6f2d281f091d8cd4c751d10b2">寻找一个 block 中的一个程序点，哪些变量是活跃的（从后往前看）。如果有 <code class="notion-inline-code">*q = y</code>，此后活跃变量为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 空集（肯定能知道 q 指向哪里除外）。</div><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d2815e9df9d4b919b7c625" data-id="35fa9ed6f2d2815e9df9d4b919b7c625"><span><div id="35fa9ed6f2d2815e9df9d4b919b7c625" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2815e9df9d4b919b7c625" title="寄存器分配"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">寄存器分配</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2817cbf55f27472c9917d">题型：三地址码 -&gt; 机器码 + 寄存器描述符和地址描述符</div><div class="notion-text notion-block-35fa9ed6f2d281268434cf19684f3dc7">不用特意记忆机器码格式。考试时会给出。</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28192bf95f54fb5c6219e" style="list-style-type:decimal"><li>概念</li></ol><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815ea364f9a8a1a962bd"><li>寄存器描述符：各个寄存器都存放了<b>哪些变量</b>的当前值。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28150bc73d2a3a91e6c0a"><li>地址描述符：某个变量的当前值存放在<b>哪个或哪些位置</b>（包括内存位置和寄存器）上。（同时在寄存器和内存中都要写！）</li></ul><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e4a4f1f7d01aa37595" style="list-style-type:decimal"><li>更新描述符的算法</li></ol><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d19883e7d615854fd8"><li>LD R, x</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d19883e7d615854fd8"><li>R 的寄存器描述符：只含 x</li><li>x 的地址描述符：添加 R</li><li>从其他不同与 x 变量的地址描述符中<b>删除 R</b></li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28167abfbfd60b988f9a8"><li>ST x, R</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28167abfbfd60b988f9a8"><li>x 的地址描述符：添加内存</li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281848e77ec3aee0ad109"><li>ADD Rx, Ry, Rz</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281848e77ec3aee0ad109"><li>Rx 的寄存器描述符：只含 x</li><li>x 的地址描述符：只含 Rx</li><li>从其他不同与 x 变量的地址描述符中<b>删除 R</b></li></ul></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28147b04fc531b089647c"><li>x = y</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28147b04fc531b089647c"><li>若生成 LD Ry, y，按照第一种情况处理</li><li>Ry 的寄存器描述符：添加 x</li><li>x 的地址描述符：只含 Ry</li></ul></ul><div class="notion-text notion-block-35fa9ed6f2d281e5a4dac901223f2424">例题：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281e1b862ca336c1548fd"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5938e63a-71ae-47b8-9379-b97c97bf3a83%3A5938e63a-71ae-47b8-9379-b97c97bf3a83.jpg?table=block&amp;id=35fa9ed6-f2d2-81e1-b862-ca336c1548fd&amp;t=35fa9ed6-f2d2-81e1-b862-ca336c1548fd" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281aeaf27d5b6681d8588"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aff8472d0-c9d1-4d38-a2d0-d8ff8a0ffff4%3Aff8472d0-c9d1-4d38-a2d0-d8ff8a0ffff4.png?table=block&amp;id=35fa9ed6-f2d2-81ae-af27-d5b6681d8588&amp;t=35fa9ed6-f2d2-81ae-af27-d5b6681d8588" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28136be65d14d96210b11">注意：<code class="notion-inline-code">a=d</code> 这个赋值不要忘记在 R2 中添加 a。</div><div class="notion-text notion-block-35fa9ed6f2d281d59537ec5c9ff1c115">STORE 指令存活跃变量时，只需要存全局变量（临时变量不用存）。看哪个全局变量的地址描述符只有寄存器，对其使用 ST 指令。地址描述符有内存的不需要存。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281ec9eb1d7785d8b7da3" data-id="35fa9ed6f2d281ec9eb1d7785d8b7da3"><span><div id="35fa9ed6f2d281ec9eb1d7785d8b7da3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281ec9eb1d7785d8b7da3" title="机器无关的优化"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">机器无关的优化</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281ad8c6bcc19287a0cec" data-id="35fa9ed6f2d281ad8c6bcc19287a0cec"><span><div id="35fa9ed6f2d281ad8c6bcc19287a0cec" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281ad8c6bcc19287a0cec" title="数据流分析（必考）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">数据流分析（必考）</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2819fa4c9df7a8c37876d">概述：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281349415c4c9f6a4c02c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A47735001-0dba-4a74-a428-5e2d72add3c5%3A47735001-0dba-4a74-a428-5e2d72add3c5.png?table=block&amp;id=35fa9ed6-f2d2-8134-9415-c4c9f6a4c02c&amp;t=35fa9ed6-f2d2-8134-9415-c4c9f6a4c02c" alt="notion image" loading="lazy" decoding="async"/></div></figure><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28144a5adff3ce31e2fee"><li>到达定值分析和可用表达式都是<b>前向</b>，活跃变量分析是<b>后向</b>。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281df8859ec3b2f13db4b"><li>前向分析的特点是 IN = 所有前驱的 OUT，后向分析的特点是 OUT = 所有后继的 IN（即算出来了就用）。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281c4bd68eec3d52b4a52"><li>到达定值分析和活跃变量分析交汇运算都是<b>并</b>，可用表达式是<b>交</b>。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28198889dcd0d3080e58c"><li>它们的传递函数都是：当前 - def/kill 再并上 use。</li></ul><div class="notion-text notion-block-35fa9ed6f2d281b48fd8c729f6bcb8a0">迭代次数不能超过基本块数量（一般是 2~3 次）</div><hr class="notion-hr notion-block-35fa9ed6f2d28140a5e3d2d58e1574fa"/><div class="notion-text notion-block-35fa9ed6f2d281308db4ff6633c664f0">到达定值（最可能考）</div><div class="notion-text notion-block-35fa9ed6f2d28104a742e48693340ca4">gen 和 kill 的例子：</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281988a35c6eb7d2690f6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:528px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ac9aae4d1-5b78-4d41-a041-c8172ad7b68f%3Ac9aae4d1-5b78-4d41-a041-c8172ad7b68f.png?table=block&amp;id=35fa9ed6-f2d2-8198-8a35-c6eb7d2690f6&amp;t=35fa9ed6-f2d2-8198-8a35-c6eb7d2690f6" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d281ba87fed66cb9222a6b">算法：gen 就是该基本块内对变量的定值，一般不会超过一次，直接无脑填上就可以。kill 是其他基本块对该变量的赋值。</div><div class="notion-text notion-block-35fa9ed6f2d281109c2cfb19025c7f72">例题：计算上图的到达定值。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281c4a18acb20a4ce15e9"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A9a58b020-67e6-446d-9a78-ad3719e184f2%3A9a58b020-67e6-446d-9a78-ad3719e184f2.png?table=block&amp;id=35fa9ed6-f2d2-81c4-a18a-cb20a4ce15e9&amp;t=35fa9ed6-f2d2-81c4-a18a-cb20a4ce15e9" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28111a541ef5b549d4f46">考试时不会给出 gen 和 kill，需要自己计算。</div><hr class="notion-hr notion-block-35fa9ed6f2d28178a5e6db919d92ca21"/><div class="notion-text notion-block-35fa9ed6f2d2817b8f21c635e20dbdb6">活跃变量分析（很可能考）</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281839594fb77eb2d1dc3"><li>use：在 B 中引用，但是<b>引用前没有被定值</b>。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28193973ffec422269c7a"><li>def：在 B 中定值，但是<b>定值前没有被引用</b>。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28156a3aef638c85559bb"><li>因为该分析是倒序，考试时看清楚表格给的顺序。</li></ul><div class="notion-text notion-block-35fa9ed6f2d281659845daa8f2fefaf8">例题：给出上图的 use def in out</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2815ab7dcffed5305d59a"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A976b16f5-248f-4ba1-b8e1-6dc5947593dc%3A976b16f5-248f-4ba1-b8e1-6dc5947593dc.png?table=block&amp;id=35fa9ed6-f2d2-815a-b7dc-ffed5305d59a&amp;t=35fa9ed6-f2d2-815a-b7dc-ffed5305d59a" alt="notion image" loading="lazy" decoding="async"/></div></figure><hr class="notion-hr notion-block-35fa9ed6f2d2812cb03ae5c3db7a3b94"/><div class="notion-text notion-block-35fa9ed6f2d2810d8b07eebb3a5411d1">可用表达式（不太可能考）</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28164ba42cffecb9f1c0f"><li>e_gen：基本块求值了 x+y，并且之后没有对 x 或 y 进行赋值，那么它生成了 x+y。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281eb8f8bc77ba8b523ee"><li>e_kill：基本块对 x 或 y 进行赋值，并且之后没有对 x+y 进行求值，那么它杀死了 x+y。</li></ul><h4 class="notion-h notion-h3 notion-h-indent-1 notion-block-35fa9ed6f2d281aeb317fbc6b3463612" data-id="35fa9ed6f2d281aeb317fbc6b3463612"><span><div id="35fa9ed6f2d281aeb317fbc6b3463612" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281aeb317fbc6b3463612" title="自然循环"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">自然循环</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2810e8e58ed15523e5f75">题型：给定一个流图，寻找其中的循环。</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281939cd1cbd1c3571197"><li>支配：如果每一条从入口结点到达 n 的路径都经过 d，我们就说 d 支配 (dominate) n，记为d dom n。每个节点都支配自己。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28135a89ae3bb88356097"><li>直接支配节点：从入口结点到达 n 的任何路径<b>（不含n）</b>中，它是路径中最后一个支配 n 的结点。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28122a5d6f2077ad20ce8"><li>流图边的分类</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281808813f8448fc4126c"><li>前进边：从结点 m 到达 m 在 DFS 树中的一个真后代的边。DFS 中的所有边都是前进边。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2819fae9efd6d42174e66"><li>后退边：从 m 到达 m 在 DFS 树中的某个祖先的边。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28124a42ce904eb409ba2"><li>交叉边：src 不是 dst 的祖先，dst 不是 src 的祖先。（即既不是前进边，也不是后退边）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281af9f4dfc3352fe0889"><li>回边：边 a-&gt;b，b dom a。所有的回边都是后退边，但后退边不全是回边（换句话说对于边 a-&gt;b，b 是 a 的祖先，但 b 不一定支配 a）。</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817a939ef8ed3267eb95"><li>可归约性：如果所有的后退边都是回边，则流图是可归约的。（实践中出现的流图基本都是可归约的）</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281658634cbc90e317f2c"><li>流图的深度：各条<b>无环路径</b>上后退边数中的最大值。</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281658634cbc90e317f2c"></ul></ul><div class="notion-text notion-block-35fa9ed6f2d28127a042dc6430c5b2e5">自然循环（重要！！）：给定边 n-&gt;d 的自然循环指的是 <b>d 加上不经过 d 就能到达 n</b> 的节点集合。d 称为循环头。</div><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281099669f39beb9c8c9f"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:288px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A06b78036-8a5c-4bbe-9804-4a3ed9e24079%3A06b78036-8a5c-4bbe-9804-4a3ed9e24079.png?table=block&amp;id=35fa9ed6-f2d2-8109-9669-f39beb9c8c9f&amp;t=35fa9ed6-f2d2-8109-9669-f39beb9c8c9f" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28143be63f79e77a44221">根据上图，找出所有的自然循环。</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d7bb9ae9731f1e79d5"><li>回边 7-&gt;4: {4, 5, 6, 7, 8, 10}</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281988bf3d5e391d491ad"><li>回边 10-&gt;7: {7, 8, 10}</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2810d9170f78bfef90c60"><li>回边 8-&gt;3, 4-&gt;3: {3, 4, 5, 6, 7, 8, 10}</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f8b9bbfa48f647955f"><li>回边 9-&gt;1: 整个流图</li></ul><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281dab5aae71caa08fd65" data-id="35fa9ed6f2d281dab5aae71caa08fd65"><span><div id="35fa9ed6f2d281dab5aae71caa08fd65" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281dab5aae71caa08fd65" title="LLVM IR"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">LLVM IR</span></span></h3><div class="notion-text notion-block-35fa9ed6f2d281b4a922f520c9981137">考试前看一眼。</div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281218e34fadb4329ce3f" data-id="35fa9ed6f2d281218e34fadb4329ce3f"><span><div id="35fa9ed6f2d281218e34fadb4329ce3f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281218e34fadb4329ce3f" title="芝士点"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">芝士点</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bca8d7dfcb56f245ec" style="list-style-type:decimal"><li>语法分析树：从非终结符号开始，直到推导出终结符号为止，没有其他信息。例子如下：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bca8d7dfcb56f245ec" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281509172e160940a5d31"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:192px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A77fcd945-aee7-43bb-9706-723f30dfd195%3A77fcd945-aee7-43bb-9706-723f30dfd195.png?table=block&amp;id=35fa9ed6-f2d2-8150-9172-e160940a5d31&amp;t=35fa9ed6-f2d2-8150-9172-e160940a5d31" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810f80c8d55c6dc7a2a2" style="list-style-type:decimal"><li>任何正则语言都有一个唯一的（不计同构）状态数目最少的 DFA。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28179b57cfa68c75bb06a" style="list-style-type:decimal"><li>不可达代码：理论上不会执行的代码。死代码：执行了不会产生效果的代码。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b79bf8eb59d0949d28" style="list-style-type:decimal"><li>支配节点：D(n) 是支配 n 的节点，不是 n 支配的节点。</li></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d281f085f3ecad21444dbf" data-id="35fa9ed6f2d281f085f3ecad21444dbf"><span><div id="35fa9ed6f2d281f085f3ecad21444dbf" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281f085f3ecad21444dbf" title="课后题 / 往年卷"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">课后题 / 往年卷</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bab80acb3f2acb4a78" style="list-style-type:decimal"><li>最左推导和最右推导：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bab80acb3f2acb4a78" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281159e86ecfcd3069d5c"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5ef19c29-0692-4641-b3b0-13d0c9dbf0e2%3A5ef19c29-0692-4641-b3b0-13d0c9dbf0e2.png?table=block&amp;id=35fa9ed6-f2d2-8115-9e86-ecfcd3069d5c&amp;t=35fa9ed6-f2d2-8115-9e86-ecfcd3069d5c" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815ba82ac5dc6177c096" style="list-style-type:decimal"><li>最右句型的句柄</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815ba82ac5dc6177c096" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281edbbfecdc561482160"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:288px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A9f4c0000-0509-435c-8e85-b484f73a1039%3A9f4c0000-0509-435c-8e85-b484f73a1039.png?table=block&amp;id=35fa9ed6-f2d2-81ed-bbfe-cdc561482160&amp;t=35fa9ed6-f2d2-81ed-bbfe-cdc561482160" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2817bbdb9c8c8fd824109">最右句型指的是每次展开最右侧的非终结符，因此最右句型的句柄需要<b>从左往右</b>寻找第一个可以被归约的式子（因为最后一个被归约的一定是最左边的）。</div></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813b859ccaf532b1ff31" style="list-style-type:decimal"><li>通过继承属性向下传递，通过综合属性向上传递</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813b859ccaf532b1ff31" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28108b01ed379202527fb"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3Ad7a6f106-accb-4f0e-b52e-6447a713636b%3Ad7a6f106-accb-4f0e-b52e-6447a713636b.png?table=block&amp;id=35fa9ed6-f2d2-8108-b01e-d379202527fb&amp;t=35fa9ed6-f2d2-8108-b01e-d379202527fb" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810d9ce5fc3c08dd781c" style="list-style-type:decimal"><li>注释语法分析树的简单例子</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810d9ce5fc3c08dd781c" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2813a8e38c0edb888cda0"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3Accd5adc1-7b37-4a18-9bde-4f5b4e6ffd40%3Accd5adc1-7b37-4a18-9bde-4f5b4e6ffd40.png?table=block&amp;id=35fa9ed6-f2d2-813a-8e38-c0edb888cda0&amp;t=35fa9ed6-f2d2-813a-8e38-c0edb888cda0" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28138be5eeb23d055c215" style="list-style-type:decimal"><li>用继承属性解决左递归</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28138be5eeb23d055c215" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281ceb274e223c660b2d6"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A35859483-5637-4d2b-a845-72f33fcad757%3A35859483-5637-4d2b-a845-72f33fcad757.png?table=block&amp;id=35fa9ed6-f2d2-81ce-b274-e223c660b2d6&amp;t=35fa9ed6-f2d2-81ce-b274-e223c660b2d6" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815d9e3fc0b9951c630b" style="list-style-type:decimal"><li>构造 DAG 一定要尽可能利用节点！举一个例子：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815d9e3fc0b9951c630b" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281d7b2c3de8a668fb306"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A3ade014c-c838-4789-b6d7-293e35182f82%3A3ade014c-c838-4789-b6d7-293e35182f82.png?table=block&amp;id=35fa9ed6-f2d2-81d7-b2c3-de8a668fb306&amp;t=35fa9ed6-f2d2-81d7-b2c3-de8a668fb306" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28148b459c1ba663cb2ce" style="list-style-type:decimal"><li>四元式、三元式、间接三元式</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28148b459c1ba663cb2ce" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281b29299dfecae169430"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Ae1af0357-1d88-4727-832b-4d54403515c5%3Ae1af0357-1d88-4727-832b-4d54403515c5.png?table=block&amp;id=35fa9ed6-f2d2-81b2-9299-dfecae169430&amp;t=35fa9ed6-f2d2-81b2-9299-dfecae169430" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281bda914c4a9cf56b422"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:480px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A98a5fb0c-989b-495e-b698-d942f78bfb71%3A98a5fb0c-989b-495e-b698-d942f78bfb71.png?table=block&amp;id=35fa9ed6-f2d2-81bd-a914-c4a9cf56b422&amp;t=35fa9ed6-f2d2-81bd-a914-c4a9cf56b422" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d28137a064e5a8fdac091f">三元式和间接三元式的区别是间接三元式有一个<b>指向三元式的列表</b>，这样一来，三元式中重复的部分就可以去掉。</div><div class="notion-text notion-block-35fa9ed6f2d2818a81d0c95745d6fb88">易错点：</div></ol></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811fb68bc563a70dd67c" style="list-style-type:decimal"><li>a = b + c 这种，需要先 + b c t1 然后 = t1 _ a</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811fb68bc563a70dd67c" style="list-style-type:lower-alpha"></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28141963dc6c840a52887" style="list-style-type:decimal"><li>四元式中有 =[]，没有 []=。三元式只有 []。因为三元式只能有两个操作数。对数组元素的赋值，都需要先求 <code class="notion-inline-code">[]</code> 出地址再进行赋值。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28141963dc6c840a52887" style="list-style-type:lower-alpha"></ol></ol><ol start="10" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819c845dd0fac760923f" style="list-style-type:decimal"><li>使用下图所示的方案翻译XXX，步骤：先构造三地址码，然后画出注释语法分析树，属性就按照方案中的来。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819c845dd0fac760923f" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281de971adb6243a83cc2"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A77aed8ee-bfe3-45e9-8906-38c314d60465%3A77aed8ee-bfe3-45e9-8906-38c314d60465.png?table=block&amp;id=35fa9ed6-f2d2-81de-971a-db6243a83cc2&amp;t=35fa9ed6-f2d2-81de-971a-db6243a83cc2" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="11" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fb9454e3da5907e590" style="list-style-type:decimal"><li>这道题记得减去一开始的偏移量 1 0 5</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fb9454e3da5907e590" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281198923ff978e8333a8"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A594eb28c-225a-4116-a97e-f0092808204e%3A594eb28c-225a-4116-a97e-f0092808204e.png?table=block&amp;id=35fa9ed6-f2d2-8119-8923-ff978e8333a8&amp;t=35fa9ed6-f2d2-8119-8923-ff978e8333a8" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="12" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a19974e47ecfe817ad" style="list-style-type:decimal"><li>显示表：指针 <code class="notion-inline-code">d[i]</code> 指向栈中最高的、嵌套深度为 i 的活动记录。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a19974e47ecfe817ad" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d281fe8e52fec97bb4ba16"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A84ca925f-d5da-4e75-bda6-e6ef3dbb8cae%3A84ca925f-d5da-4e75-bda6-e6ef3dbb8cae.png?table=block&amp;id=35fa9ed6-f2d2-81fe-8e52-fec97bb4ba16&amp;t=35fa9ed6-f2d2-81fe-8e52-fec97bb4ba16" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2815683f4fff96a879bb6">除主程序外，其余的表项在开头要写上调用的函数及实参值，第二行写 <code class="notion-inline-code">保存的d[i]</code>，第三行留空（表示还有其余内容）。</div></ol></ol><ol start="13" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e0b710d5365e1c37c5" style="list-style-type:decimal"><li>基本块的 DAG：标好下标！！</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e0b710d5365e1c37c5" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2815481eef0ee410bd0af"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column"><img src="https://www.notion.so/image/attachment%3A37418704-d84c-4c09-ab28-e0bf174b0009%3A37418704-d84c-4c09-ab28-e0bf174b0009.png?table=block&amp;id=35fa9ed6-f2d2-8154-81ee-f0ee410bd0af&amp;t=35fa9ed6-f2d2-8154-81ee-f0ee410bd0af" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol></ol><ol start="14" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810cb649ce76ba93f0a2" style="list-style-type:decimal"><li>对归纳变量进行强度削减，可以将乘法换为加法。并将循环不变表达式外提。</li></ol><ol start="15" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281ddb5f0eb132171950d" style="list-style-type:decimal"><li>计算支配关系，是 D(B)，表示<b>支配 B 的节点</b>！！！！</li></ol></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[概率论与数理统计—期末笔记]]></title>
            <link>http://arys.top/article/prob-final</link>
            <guid>http://arys.top/article/prob-final</guid>
            <pubDate>Tue, 07 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[介绍了概率论与数理统计两部分的基本知识点。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d28082ba10cffed4007b94"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d280c3bc88d1581cf98fb2"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🗒️">🗒️</span></div><div class="notion-callout-text">这篇是南京大学 <span class="notion-yellow">概率论与数理统计</span> 24 Fall 的期末复习笔记。</div></div><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d28114b864fa78dec5c31d" data-id="35fa9ed6f2d28114b864fa78dec5c31d"><span><div id="35fa9ed6f2d28114b864fa78dec5c31d" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d28114b864fa78dec5c31d" title="知识点"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">知识点</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a5b43af87207076347" style="list-style-type:decimal"><li>大数定律</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a5b43af87207076347" style="list-style-type:lower-alpha"><li>描述：随机变量的平均值<b>依概率</b>收敛于它们数学期望的平均值。</li><li>公式</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bcb5d8d3414de21e66" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>马尔可夫大数定律：设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 两两独立，<b>均值的方差</b>趋于 0（<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>）。</li><li>切比雪夫大数定律：设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 两两独立，方差一致有界（存在常数 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，使得 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，对一切 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 成立）。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814693dfe75aa8ba38c0" style="list-style-type:lower-roman"><div class="notion-text notion-block-35fa9ed6f2d281198b13f43a3033e867">证明：先证明上面那个结论，再通过切比雪夫不等式。</div></ol><li>独立同分布大数定律：随机变量的平均值依概率收敛于<b>这个分布的数学期望</b>。</li><li>伯努利大数定律：n 重伯努利试验的频率趋向于该事件理论发生的概率。</li></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281118030f3c48968e888" style="list-style-type:decimal"><li>中心极限定理</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281118030f3c48968e888" style="list-style-type:lower-alpha"><li>独立同分布的随机变量的和的极限分布是正态分布。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28168aaaec815f08ed576" style="list-style-type:lower-roman"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2815298dee89a1231b296"><li>公式描述：</li></ul><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>拉普拉斯中心极限定理：设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 为 n 次伯努利实验中事件发生的个数，则</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cc99abd53450e5291f" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281ed9ce3ecc8b38643fa" style="list-style-type:decimal"><li>（简单随机）<b>样本：独立同分布</b>的随机变量。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d287e0e6d7ed7884ee" style="list-style-type:decimal"><li>g 是样本的函数，且 g <b>不含未知参数</b>，则 g 为统计量。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813cb6c3ca88e80feeb0" style="list-style-type:decimal"><li>常用统计量</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813cb6c3ca88e80feeb0" style="list-style-type:lower-alpha"><li>样本均值</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2817fa09bf7428c0939de" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>样本方差

后面这个变形比较关键。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28136a1f9d20f17d25698" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>二者关系：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281138cc5d226119a7a30" style="list-style-type:decimal"><li>矩</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281138cc5d226119a7a30" style="list-style-type:lower-alpha"><li>k 阶（原点）矩：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>样本 k 阶（原点）矩：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，样本均值是样本 1 阶原点矩</li><li>k 阶中心距：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><li>样本 k 阶中心距：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，样本方差是样本 2 阶中心距</li></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28197a9ccf2e90a210810" style="list-style-type:decimal"><li>观测值就是将大写字母换成小写。</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281aaa8f9f3bd2d068308" style="list-style-type:decimal"><li>三大分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281aaa8f9f3bd2d068308" style="list-style-type:lower-alpha"><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816eb859d883c18f62eb" style="list-style-type:lower-roman"><li>设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 相互独立，均服从 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> ，则 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 服从自由度为 n 的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布，记为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li><li>概率密度图：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28156a8b3dbad5eb5d6f0" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2806dbc9dd93b29e8e839"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A5d6086ed-6ab9-44cd-9dd7-f0b83e049184%3Achi2.png?table=block&amp;id=35fa9ed6-f2d2-806d-bc9d-d93b29e8e839&amp;t=35fa9ed6-f2d2-806d-bc9d-d93b29e8e839" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布的可加性：若 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布（Student 分布）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28104a197f85cb6933796" style="list-style-type:lower-roman"><li>设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 相互独立，则</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819abd3ceb4e9fc271f4" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>t 分布的密度函数关于 t = 0 对称。n 充分大时，密度函数接近于标准正态分布。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819c9904f7b0807fdf39" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2808a9a4bf902c3657c69"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A91b92686-921e-4d9b-a243-ea3a15a6f8c7%3At.png?table=block&amp;id=35fa9ed6-f2d2-808a-9a4b-f902c3657c69&amp;t=35fa9ed6-f2d2-808a-9a4b-f902c3657c69" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>分位点的性质：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。（和标准正态分布相同）。n 较大（&gt; 45）时，可利用标准正态分布近似 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819880aed57eeb3ed5f7" style="list-style-type:lower-roman"><li>设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 相互独立。则：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281eb97f1df8a9bb1bf79" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>概率密度：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281108eafc8817118ce0c" style="list-style-type:decimal"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28012adc6eb24baa73f1b"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A9398e80f-e1bb-428c-a20e-fb0452d5a370%3Af.png?table=block&amp;id=35fa9ed6-f2d2-8012-adc6-eb24baa73f1b&amp;t=35fa9ed6-f2d2-8012-adc6-eb24baa73f1b" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>F 分布的分位点只有 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 为小数值的情况，对于大的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 利用：

即倒数 + 自由度反过来。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c49e9fe4438264177a" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol></ol><ol start="9" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c284a0ca2d5b0deb4d" style="list-style-type:decimal"><li>五个重要的分布：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c284a0ca2d5b0deb4d" style="list-style-type:lower-alpha"><li>样本均值服从正态分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2814594dee0813baadabc" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>样本方差的分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a0ade2e9dc96e979c7" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d281268155c9e7e37b07af">适用于 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 未知的情况。</div><div class="notion-text notion-block-35fa9ed6f2d2810db712df8b65a65f34">注：这里自由度为 n-1 是因为其中减的是样本均值，如果减的是真实的 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 那么自由度为 n。</div></ol><li>由前两个推得：
<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 未知用样本均值替代，但是分布变为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布。<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 已知用第一个式子。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b994ffef95c81a6eb1" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>两总体样本方差比的分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f896bfca90e89471b5" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>两总体样本均值差的分布

若 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 未知，则（用样本联合方差代替真实方差，则分布变为 t 分布）：

其中联合方差：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28153a3def61f70769ce1" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol><ol start="10" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281afb7c6c4c8af22195b" style="list-style-type:decimal"><li>点估计</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281afb7c6c4c8af22195b" style="list-style-type:lower-alpha"><li>矩估计</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2817da165e04465572087" style="list-style-type:lower-roman"><li>以样本矩作为总体矩的估计（=），从而得到参数的估计。</li><li>本质：构造 n 个方程并求解。</li><li>特例：若某个样本 k 阶原点矩为 0，则需要顺延利用下一个。</li><li>重要结论：无论总体服从何分布，均有：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812e8cc3fc1bf3c7d92a" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>相关系数的矩估计</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28184b420de7fe0807cce" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol><li>极大似然估计</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811ba7d0dad709aa17f7" style="list-style-type:lower-roman"><li>核心：构造似然函数 -&gt; 此函数取最大值时的参数</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e68eb0f3de52bcdca4" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>方法：若有一个参数，则使用似然函数对该参数求导数，令导数 = 0。若有 k 个参数，则似然函数分别对这 k 个参数求偏导，令这些偏导都 = 0。有时为了方便求导会取对数。</li><li>极大似然估计的不变性（存疑，先这样记）：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。条件是有单值反函数 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819e9e4cf25fd69972ed" style="list-style-type:decimal"><div class="notion-text notion-block-35fa9ed6f2d281378dd1d4fd609e399d">考试：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 是 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的极大似然估计，则 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 是 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的极大似然估计。</div></ol><li>特例：似然方程组无解时（单调），直接从<b>函数本身</b>分析，找好限制条件（自变量的取值范围）。</li><li>离散型通常不能将密度写作密度函数，因此只能求估计值，不能求估计量。</li></ol><li>估计量的评选标准</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813c92f7fa0a7950b36b" style="list-style-type:lower-roman"><li>无偏性</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281169e17e0b23573c536" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>有效性</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c6a680c1641a852a45" style="list-style-type:decimal"><li>设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 是 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的无偏估计量，则方差小的更有效。</li><li>当 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 是 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的无偏估计量时，均方误差准则 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 与有效性一致。</li></ol></ol></ol></ol><ol start="11" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818ab704ffa51a5d2cf4" style="list-style-type:decimal"><li>区间估计</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818ab704ffa51a5d2cf4" style="list-style-type:lower-alpha"><li>枢轴变量法：先找一个样本函数 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 只包含待估参数，对于事先给定的置信度根据 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的分布寻找两个常数 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，使得<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，再根据不等式变形解出。</li><li>已知方差的单正态总体，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 置信度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的置信区间为：

利用枢轴变量：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28182ac8af28744457300" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>未知方差的单正态总体，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 置信度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的置信区间为：

利用枢轴变量：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cebbfff3200b079108" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>单正态总体，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 置信度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的置信区间为：

注：这是一个概率对称的区间，并非最大。利用枢轴变量：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b09160eab190c84860" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>双正态总体，方差已知，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 置信度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的置信区间为：

利用枢轴变量：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c6ab75c54ee69ffccb" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>双正态总体，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 置信度为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的置信区间为：

利用枢轴变量：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f592b5c68a35c19537" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol></ol></ol><ol start="12" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811a9a57de2bb61850e8" style="list-style-type:decimal"><li>假设检验</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811a9a57de2bb61850e8" style="list-style-type:lower-alpha"><li>流程（以一道题为例）</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2813aab61e7267b76ec36" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280a1b72ffe86eff837ab"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:100%;max-width:100%;flex-direction:column;height:100%"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A556a3307-77e0-47a2-bfd8-b424a7c45914%3Aexample.png?table=block&amp;id=35fa9ed6-f2d2-80a1-b72f-fe86eff837ab&amp;t=35fa9ed6-f2d2-80a1-b72f-fe86eff837ab" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280098e9df44c4ea08789"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:384px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aecbed509-abbf-4712-998c-eb73d5593c20%3Asolution.jpg?table=block&amp;id=35fa9ed6-f2d2-8009-8e9d-f44c4ea08789&amp;t=35fa9ed6-f2d2-8009-8e9d-f44c4ea08789" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2812eb6e5e539e674bd83">一共 5 步：先写出假设 H0 和 H1，然后“若 H0 成立，”写出统计量及其服从的分布，然后写出拒绝域，再写出观测值，最后得出结论拒绝 / 接受 H0。</div></ol><li>设假设的技巧：不论单边还是双边，H0 始终是等号 =，H1 分情况：若是双边检验，则为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>；若是单边检验，看题目描述，涉及质量标准的，将<b>不合格</b>设置为 H1，涉及评价性的（例如：能否认为 XXX），将 XXX 设置为 H1。</li><li>关于假设检验的五张表：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281598e36f17a3ea6f634" style="list-style-type:lower-roman"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280768997cca41b3c83db"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A2c9164f8-cff3-4d71-978d-1c801ee088a0%3At1.png?table=block&amp;id=35fa9ed6-f2d2-8076-8997-cca41b3c83db&amp;t=35fa9ed6-f2d2-8076-8997-cca41b3c83db" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2801daac5cad6b69cb623"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A4f10c799-2540-489d-9162-f48b669ce27d%3At2.png?table=block&amp;id=35fa9ed6-f2d2-801d-aac5-cad6b69cb623&amp;t=35fa9ed6-f2d2-801d-aac5-cad6b69cb623" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280018536eb56ccb3ffc3"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A86da2629-462d-46a8-9109-49a8ff3a7728%3At3.png?table=block&amp;id=35fa9ed6-f2d2-8001-8536-eb56ccb3ffc3&amp;t=35fa9ed6-f2d2-8001-8536-eb56ccb3ffc3" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d2804bad8feabad78662f3"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3Aff1e00b4-8dc8-4004-aab6-e08e059708c1%3At4.png?table=block&amp;id=35fa9ed6-f2d2-804b-ad8f-eabad78662f3&amp;t=35fa9ed6-f2d2-804b-ad8f-eabad78662f3" alt="notion image" loading="lazy" decoding="async"/></div></figure><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d28066aa58fd316be76090"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A76feb49c-2f31-4487-8fc0-8835d393f799%3At5.png?table=block&amp;id=35fa9ed6-f2d2-8066-aa58-fd316be76090&amp;t=35fa9ed6-f2d2-8066-aa58-fd316be76090" alt="notion image" loading="lazy" decoding="async"/></div></figure></ol><li>非正态总体的假设检验</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281ecbe5fd45be9765bce" style="list-style-type:lower-roman"><li>核心思想：利用<b>中心极限定理</b>，将观测值近似看作标准正态分布，将方差近似用样本方差替代。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a4b3b2c8ff54fc25fd" style="list-style-type:decimal"><div class="notion-text notion-block-35fa9ed6f2d281558c91e86332ac2499">考试要写：由<b>中心极限定理</b>，XX 近似服从 XX</div></ol><li>单总体均值：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815fa0beeeca3eb6d363" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d280208d83d72cae57a48f">当 n 充分大时，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 近似服从标准正态分布，按照 u 检验法检验即可。</div></ol><li>双总体均值</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2803ba6fdd7018fdd54ea" style="list-style-type:decimal"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d280a38ec4fbbff359af67">当 n 充分大时，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 近似服从标准正态分布，按照 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 检验法检验即可。</div></ol></ol></ol></ol><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d2813c97dbcd8bfbd56cb5" data-id="35fa9ed6f2d2813c97dbcd8bfbd56cb5"><span><div id="35fa9ed6f2d2813c97dbcd8bfbd56cb5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2813c97dbcd8bfbd56cb5" title="往年卷 / 注意事项"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">往年卷 / 注意事项</span></span></h3><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281988096ea36e4098339" style="list-style-type:decimal"><li><b>用到什么写什么</b>。比如用到中心极限定理，要写：“由中心极限定理，XXX”；比如用到区间估计的公式，要把原始式子写上。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c19081ee7b8c54a350" style="list-style-type:decimal"><li>对数正态分布</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c19081ee7b8c54a350" style="list-style-type:lower-alpha"><li>概率密度函数</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28127bd10c75927ae6a8e" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>期望</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f6bea5d7cdd3397c67" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span><div class="notion-text notion-block-35fa9ed6f2d280a3915bf493dc11de41">计算要点：将平方里面的整体换元。</div></ol><li>方差</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2818c8645de937c24c79a" style="list-style-type:lower-roman"><span role="button" tabindex="0" class="notion-equation notion-equation-block"><span></span></span></ol><li>求极大似然估计：取对数即可。</li></ol></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b3b986ff14dae2bc46" style="list-style-type:decimal"><li><span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布与 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 分布的考察</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281b3b986ff14dae2bc46" style="list-style-type:lower-alpha"><figure class="notion-asset-wrapper notion-asset-wrapper-image notion-block-35fa9ed6f2d280838fd8fdabaedaecb1"><div style="position:relative;display:flex;justify-content:center;align-self:center;width:432px;max-width:100%;flex-direction:column"><img style="object-fit:cover" src="https://www.notion.so/image/attachment%3A4878a23b-1d0d-4250-8036-ba5687fd5a8d%3Aeg1.png?table=block&amp;id=35fa9ed6-f2d2-8083-8fd8-fdabaedaecb1&amp;t=35fa9ed6-f2d2-8083-8fd8-fdabaedaecb1" alt="notion image" loading="lazy" decoding="async"/></div></figure><div class="notion-text notion-block-35fa9ed6f2d2819d92bee359e9a86edd">本题的求解思路是设 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，求出 Z 的分布函数，最终发现 Z 服从参数为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的指数分布。</div></ol></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810eb346c5ad379d6cfe" style="list-style-type:decimal"><li>求一长串式子服从什么分布，一定要说明一下 上下两个是<b>独立</b>的！！</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281bc980cd95256c613fd" style="list-style-type:decimal"><li>用到不变性要强调一下单调函数。</li></ol></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[高程Project设计与思考]]></title>
            <link>http://arys.top/article/ap-project</link>
            <guid>http://arys.top/article/ap-project</guid>
            <pubDate>Mon, 24 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[本文介绍了高级程序设计的期末大作业设计思路，以及对本门课程的一些思考。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d2809aabc0f6f5c4fcd5d3"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d28079bcdefd5995aaf790"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text"><div class="notion-text notion-block-35fa9ed6f2d28087b000c5819aa56f47">本文是南京大学计科 <span class="notion-yellow">高级程序设计</span> 25 spring 期末大作业的设计，及助教过程中的思考。笔者在 24 spring 修读本课程，取得了 90 分的成绩，在 25 spring 担任这门课的助教，并完全负责期末大作业的设计工作。</div></div></div><div class="notion-text notion-block-35fa9ed6f2d280b28ef7c2dda3c4daae">先奉上 GitHub 仓库：</div><a class="notion-external notion-external-block notion-row notion-block-35fa9ed6f2d28083870efa2800fa4d79" href="https://github.com/Aryxis/Kniflash" target="_blank" rel="noopener noreferrer"><div class="notion-external-image"><svg viewBox="0 0 260 260"><g><path d="M128.00106,0 C57.3172926,0 0,57.3066942 0,128.00106 C0,184.555281 36.6761997,232.535542 87.534937,249.460899 C93.9320223,250.645779 96.280588,246.684165 96.280588,243.303333 C96.280588,240.251045 96.1618878,230.167899 96.106777,219.472176 C60.4967585,227.215235 52.9826207,204.369712 52.9826207,204.369712 C47.1599584,189.574598 38.770408,185.640538 38.770408,185.640538 C27.1568785,177.696113 39.6458206,177.859325 39.6458206,177.859325 C52.4993419,178.762293 59.267365,191.04987 59.267365,191.04987 C70.6837675,210.618423 89.2115753,204.961093 96.5158685,201.690482 C97.6647155,193.417512 100.981959,187.77078 104.642583,184.574357 C76.211799,181.33766 46.324819,170.362144 46.324819,121.315702 C46.324819,107.340889 51.3250588,95.9223682 59.5132437,86.9583937 C58.1842268,83.7344152 53.8029229,70.715562 60.7532354,53.0843636 C60.7532354,53.0843636 71.5019501,49.6441813 95.9626412,66.2049595 C106.172967,63.368876 117.123047,61.9465949 128.00106,61.8978432 C138.879073,61.9465949 149.837632,63.368876 160.067033,66.2049595 C184.49805,49.6441813 195.231926,53.0843636 195.231926,53.0843636 C202.199197,70.715562 197.815773,83.7344152 196.486756,86.9583937 C204.694018,95.9223682 209.660343,107.340889 209.660343,121.315702 C209.660343,170.478725 179.716133,181.303747 151.213281,184.472614 C155.80443,188.444828 159.895342,196.234518 159.895342,208.176593 C159.895342,225.303317 159.746968,239.087361 159.746968,243.303333 C159.746968,246.709601 162.05102,250.70089 168.53925,249.443941 C219.370432,232.499507 256,184.536204 256,128.00106 C256,57.3066942 198.691187,0 128.00106,0 Z M47.9405593,182.340212 C47.6586465,182.976105 46.6581745,183.166873 45.7467277,182.730227 C44.8183235,182.312656 44.2968914,181.445722 44.5978808,180.80771 C44.8734344,180.152739 45.876026,179.97045 46.8023103,180.409216 C47.7328342,180.826786 48.2627451,181.702199 47.9405593,182.340212 Z M54.2367892,187.958254 C53.6263318,188.524199 52.4329723,188.261363 51.6232682,187.366874 C50.7860088,186.474504 50.6291553,185.281144 51.2480912,184.70672 C51.8776254,184.140775 53.0349512,184.405731 53.8743302,185.298101 C54.7115892,186.201069 54.8748019,187.38595 54.2367892,187.958254 Z M58.5562413,195.146347 C57.7719732,195.691096 56.4895886,195.180261 55.6968417,194.042013 C54.9125733,192.903764 54.9125733,191.538713 55.713799,190.991845 C56.5086651,190.444977 57.7719732,190.936735 58.5753181,192.066505 C59.3574669,193.22383 59.3574669,194.58888 58.5562413,195.146347 Z M65.8613592,203.471174 C65.1597571,204.244846 63.6654083,204.03712 62.5716717,202.981538 C61.4524999,201.94927 61.1409122,200.484596 61.8446341,199.710926 C62.5547146,198.935137 64.0575422,199.15346 65.1597571,200.200564 C66.2704506,201.230712 66.6095936,202.705984 65.8613592,203.471174 Z M75.3025151,206.281542 C74.9930474,207.284134 73.553809,207.739857 72.1039724,207.313809 C70.6562556,206.875043 69.7087748,205.700761 70.0012857,204.687571 C70.302275,203.678621 71.7478721,203.20382 73.2083069,203.659543 C74.6539041,204.09619 75.6035048,205.261994 75.3025151,206.281542 Z M86.046947,207.473627 C86.0829806,208.529209 84.8535871,209.404622 83.3316829,209.4237 C81.8013,209.457614 80.563428,208.603398 80.5464708,207.564772 C80.5464708,206.498591 81.7483088,205.631657 83.2786917,205.606221 C84.8005962,205.576546 86.046947,206.424403 86.046947,207.473627 Z M96.6021471,207.069023 C96.7844366,208.099171 95.7267341,209.156872 94.215428,209.438785 C92.7295577,209.710099 91.3539086,209.074206 91.1652603,208.052538 C90.9808515,206.996955 92.0576306,205.939253 93.5413813,205.66582 C95.054807,205.402984 96.4092596,206.021919 96.6021471,207.069023 Z" fill="#161614"></path></g></svg></div><div class="notion-external-description"><div class="notion-external-title">Kniflash</div><div class="notion-external-block-desc">Aryxis<span> • </span>Updated Apr 8, 2026</div></div></a><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d280cb8742ea9640aa7ff5" data-id="35fa9ed6f2d280cb8742ea9640aa7ff5"><span><div id="35fa9ed6f2d280cb8742ea9640aa7ff5" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d280cb8742ea9640aa7ff5" title="期末大作业的设计"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">期末大作业的设计</span></span></h3><div class="notion-text notion-block-35fa9ed6f2d2804e8dfdedd0ed443267">本门课程的期末大作业，按照往届惯例，是用 Qt/C++ 开发一个小游戏。不过，作业为助教负责布置，助教们也没什么时间把心思放在游戏 idea 上，所以基本上是借鉴现有的游戏，进行阉割或改编。我修读的 24 spring 是一个塔防游戏，之前还做过异形工厂、环世界什么的。</div><div class="notion-text notion-block-35fa9ed6f2d280cfb907e0ae01912ff0">上次修读时，期末那一个月基本上全是在赶这个作业，给我留下了不小的心理阴影。这学期轮到我来设计，肯定要给学弟学妹们手下留情，因此我在写大作业文档时遵守这些规则：</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2802794c1d4737dc58e75" style="list-style-type:decimal"><li>难度一定要适中，并且尽量控制开放程度。期末大作业依托课程设计，目的在于锻炼编程能力而不是游戏开发能力，甚至 Qt 也不是必须的（只是为了学习面向对象编程）。这只是一个作业而已，上学期我花了太多时间在这个上面，我不希望这个作业影响到同学们的心理健康。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d280a0bf34d87bcdc4ba05" style="list-style-type:decimal"><li>描述一定要精准。尽量不出现歧义，CS 尤其是 OJ 描述极有可能出现歧义，导致 100 个人写出 100 个实现。虽然这是一个项目，可以有一定程度的自由发挥，但是在具体得分的地方还是尽可能精准为好。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d280afa131d6f5c88f3244" style="list-style-type:decimal"><li>尽力让做完项目的同学收获更多东西。此时我也只是一个大二学生，编程才刚学一年多，因此论知识可能不比来上课的同学丰富，仅仅比他们多上了一年学而已，大部分都是现学现卖。</li></ol><div class="notion-text notion-block-35fa9ed6f2d280b8b326d33139679619">首先是游戏 idea，本次项目选择了“转刀游戏”这个主题，借鉴了逛 <a class="notion-link" href="https://www.crazygames.com/" target="_blank" rel="noopener noreferrer">CrazyGames</a> 时遇到的一个挺好玩的游戏（<a class="notion-link" href="https://www.crazygames.com/game/knife-io" target="_blank" rel="noopener noreferrer">点此体验</a>）。 这个游戏界面简单，玩法丰富，很适合拿来做期末项目😋。</div><div class="notion-text notion-block-35fa9ed6f2d28000a7f9c7024a9d662f">然后就是项目设计了。我参考了往届的两个项目手册，并砍掉了一些个人觉得不太必要的地方（比如强制使用异常处理）。至于难度方面，这个就见仁见智了，我只能说从零开始熟悉一个库并用它来做项目着实不易，但是这门课向来如此，每年的期末大项目都是用 Qt 写游戏，我能做的就是深度体验这个游戏，仔细斟酌手册中描述的每一句话，尽可能做到循序渐进和没有歧义。由于手册写得有一些长，为了让同学们在实现时快速抓住重点，我在每一章的结尾都写了一个任务清单，保证评分标准公开透明。</div><div class="notion-text notion-block-35fa9ed6f2d28010af25fe3e254fe391">为了让同学们学到更多东西，我也是将上大学以来积攒的经验在手册里倾囊相授了。首先是 Markdown，这几乎是对我本人影响最大的一门语言了，改变了我记录和思考的方式。大一上的时候我还拿着平板在写写画画，从大一下开始我每天都会面对数个 Markdown 文件，通过 Typora 进行写作（<span class="notion-link-mention"><a href="https://typora.io/" target="_blank" rel="noopener noreferrer" class="notion-link-mention-link"><img class="notion-link-mention-icon" src="https://typora.io/img/favicon-128.png" alt="typora"/><span class="notion-link-mention-provider">typora</span><span class="notion-link-mention-title">A new way to read &amp; write Markdown</span></a><div class="notion-link-mention-preview"><article class="notion-link-mention-card"><img class="notion-link-mention-preview-thumbnail" src="https://typora.io/img/twitter-sum.png" alt="A new way to read &amp; write Markdown" referrerPolicy="same-origin"/><div class="notion-link-mention-preview-content"><p class="notion-link-mention-preview-title">A new way to read &amp; write Markdown</p><p class="notion-link-mention-preview-description">Typora is a cross-platform minimal markdown editor, providing seamless experience for both markdown readers and writers.</p><div class="notion-link-mention-preview-footer"><img class="notion-link-mention-preview-icon" src="https://typora.io/img/favicon-128.png" alt="typora" referrerPolicy="same-origin"/><span class="notion-link-mention-preview-provider">typora</span></div></div></article></div></span> 是我最喜欢的 Markdown 写作工具，也是我认为买的最值的软件）。关于这个项目，我引入 Markdown 的方式是<b>项目文档</b>，通过让学生写项目文档来熟悉 Markdown。项目文档的要求来自 <span class="notion-link-mention"><a href="https://sp21.datastructur.es/materials/proj/proj2/proj2" target="_blank" rel="noopener noreferrer" class="notion-link-mention-link"><img class="notion-link-mention-icon" src="https://sp21.datastructur.es/assets/images/josh4.png"/><span class="notion-link-mention-title">Project 2: Gitlet | CS 61B Spring 2021</span></a><div class="notion-link-mention-preview"><article class="notion-link-mention-card"><img class="notion-link-mention-preview-thumbnail" alt="Project 2: Gitlet | CS 61B Spring 2021" referrerPolicy="same-origin"/><div class="notion-link-mention-preview-content"><p class="notion-link-mention-preview-title">Project 2: Gitlet | CS 61B Spring 2021</p><p class="notion-link-mention-preview-description">Computer Science 61B: Data Structures</p><div class="notion-link-mention-preview-footer"><img class="notion-link-mention-preview-icon" src="https://sp21.datastructur.es/assets/images/josh4.png" referrerPolicy="same-origin"/><span class="notion-link-mention-preview-provider"></span></div></div></article></div></span>。</div><div class="notion-text notion-block-35fa9ed6f2d280e8ae4bf14e1db3dcaf">其次是 clang-format 自动格式化代码。这个工具我第一次知道时惊为天人，世界上竟然还有如此之工具，我立刻在所有 C/C++ 仓库都加上了 .clang-format 文件。有一个 formatOnSave 的格式化工具，真的可以减轻很多编码负担。</div><div class="notion-text notion-block-35fa9ed6f2d28066b5f5ed582a5536f7">最后，是关于如何学好 CS 的一点点经验。当了助教才发现，有相当一部分不是计科的同学来选修这门课，他们可能之前只有一点基础，想通过这门课程学 C++（傻孩子们，快跑吧），因此更需要让学生们了解一下 CS 的“自学传统”和”提问技巧“这两个问题。</div><div class="notion-text notion-block-35fa9ed6f2d280b0aa07c64da01dc8cf">综上，这也算是我一个挺用心的项目手册了，在具体实施时确实获得了同学们的好评。我也通过书写手册了解了很多东西，算是用心投入的回报吧。下面附上手册的最终版：</div><figure class="notion-asset-wrapper notion-asset-wrapper-pdf notion-block-35fa9ed6f2d280ffaa5dfb2f86c530e8"><div style="position:relative;display:block;justify-content:center;align-self:center;width:708px;max-width:100%;flex-direction:column;height:320px;overflow:auto;background:rgb(226, 226, 226);padding:8px 16px"></div></figure><h3 class="notion-h notion-h2 notion-h-indent-0 notion-block-35fa9ed6f2d280fabbdbca53196179f1" data-id="35fa9ed6f2d280fabbdbca53196179f1"><span><div id="35fa9ed6f2d280fabbdbca53196179f1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d280fabbdbca53196179f1" title="关于这门课的一些思考"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">关于这门课的一些思考</span></span></h3><div class="notion-text notion-block-35fa9ed6f2d280df8029ef36c68700a4">高级程序设计这门课，其实一直以来都风评褒贬不一，劝退力度很大，知乎上甚至有拖了好几个学期也不敢来上的同学。究其原因，我认为是这门课程的教学方法有一些问题。作为大一下开展的一门<b>编程课</b>，其 OJ 基本上全是数据结构与算法的内容。课堂讲 C++ 编程语言，OJ 来写算法题，本身是比较割裂的。另一方面，OJ 和项目<b>全为</b>助教负责，导致难度完全取决于助教的心情和水平。而这门课的学生呢？跨专业的就不说了，CS 本院学生，如果没有基础的话，大部分只学过微积分和一点点编程。大一上的程序设计基础（C 语言）和 SICP (Python) 是二选一，如果选择了 SICP，那确实得到了不小的训练，但是这些同学可能连 C++ stl 都不会用，怎么会写算法题。听说 26 spring 这门课变成必修的，而且 OJ 全程断网在机房限时做，对同学们的要求更高了。作为曾经的助教，肯定是希望这门课程越来越好，可现实是这种模式在很长一段时间都不会有所改观，每年一换的助教也使得每次 OJ 和项目的方差较大。只能期待 jyy 的教改大手颠覆呢喃 CS 的教学体系了（bushi）。</div><div class="notion-blank notion-block-35fa9ed6f2d2801187a9cab2929ebec4"> </div></main></div>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[图论与算法—期末笔记]]></title>
            <link>http://arys.top/article/gta-final</link>
            <guid>http://arys.top/article/gta-final</guid>
            <pubDate>Mon, 26 May 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[主要是图论相关的概念和常用算法。]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-35fa9ed6f2d28095ae9df0d4dd1544f9"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><div class="notion-callout notion-gray_background_co notion-block-35fa9ed6f2d280b48f00cca2c958f210"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="🗒️">🗒️</span></div><div class="notion-callout-text">这篇文章是南京大学 <span class="notion-yellow"><a class="notion-link" href="http://ws.nju.edu.cn/courses/gta" target="_blank" rel="noopener noreferrer">图论与算法 (GTA)</a></span><span class="notion-default"> 的期末复习笔记。</span></div></div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d281f28c1fc02091d1a7cb" data-id="35fa9ed6f2d281f28c1fc02091d1a7cb"><span><div id="35fa9ed6f2d281f28c1fc02091d1a7cb" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281f28c1fc02091d1a7cb" title="1 概念题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">1 概念题</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d1bac1f5c49f0e4ac5" style="list-style-type:decimal"><li>图的点数 n，边数 m</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28178a41ec2822804f956" style="list-style-type:decimal"><li>度：一个顶点所连接的边的数量。最大度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，最小度 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28108bbebc28c0578cbde" style="list-style-type:decimal"><li>离心率：ecc(v) 指的是 v 到所有顶点的距离的最大值</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811fb5e6e4ae0c8ab40b" style="list-style-type:decimal"><li>中心点：离心率最小的顶点；半径：中心点的离心率</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815fba8dda1e3fbbb0ce" style="list-style-type:decimal"><li>边缘点：离心率最大的顶点；直径：边缘点的离心率</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d4af30e31b557bb877" style="list-style-type:decimal"><li>点连通度：使图不连通或退化为单个顶点所需删除的最少顶点数，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d4af30e31b557bb877" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281809e21e73d78cd0b13"><li>k-连通图指的是 k 点连通</li></ul></ol></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281db80cbc256492ca76b" style="list-style-type:decimal"><li>边连通度：使图不连通所需删除的最少边数，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281db80cbc256492ca76b" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281e0a687f42e54d0cfdc"><li>结论：简单连通图 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281fea8fbd2dc8bbc8f2c" style="list-style-type:decimal"><li>二分图：没有奇圈</li></ol><ol start="9" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dba835d23fa59f10fa" style="list-style-type:decimal"><li>边独立数：最大匹配的边数（即无公共顶点的边集合的最大大小）<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="10" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28189860bc915cbee1bbc" style="list-style-type:decimal"><li>边覆盖数：覆盖所有顶点的最小边集合的大小 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="11" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a1be18ea0faef028e8" style="list-style-type:decimal"><li>边支配数：最小的边集合，使得图中每条边要么属于该集合，要么与它邻接 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="12" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d5a52cd08913308b4f" style="list-style-type:decimal"><li>点独立数：最大独立集的顶点数（即没有边连接的顶点集合的最大大小）<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="13" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281c1bf0cc92f285452ed" style="list-style-type:decimal"><li>点覆盖数：覆盖所有边的最小顶点集合的大小 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="14" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281218df6c86d8ee42c64" style="list-style-type:decimal"><li>点支配数：最小的顶点集合，使得图中每个顶点要么属于该集合，要么与它邻接 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="15" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2810a9302d6787e2403a4" style="list-style-type:decimal"><li>边色数：给图的边着色所需的最小颜色数，使得相邻边颜色不同 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="16" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28159a708c4a162a322e2" style="list-style-type:decimal"><li>点色数：给图的顶点着色所需的最小颜色数，使得相邻顶点颜色不同 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28159a708c4a162a322e2" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28182bb8ef5546ed9a977"><li>Vizing 定理：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol></ol><ol start="17" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dfb26fe36e53f0fff0" style="list-style-type:decimal"><li>平面图：嵌入平面中，使得任何两条边不相交</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281dfb26fe36e53f0fff0" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28186a197e2b11823838b"><li>判定的充要条件：平面图 $$ 不包含与 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 或 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 同胚的子图</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28113801ce33a0bbde838"><li>平面图的欧拉公式：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>
其中顶点数为 <em>n</em>，边数为 <em>m</em>，面数为 <em>f</em>，连通分支数为 <em>k</em></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28159960dd812237e8940"><li>简单连通平面图：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28103b9fff52721b89144"><li>无 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 的简单连通平面图：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ul></ol></ol><ol start="18" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cc8dcffa8851b5e4b1" style="list-style-type:decimal"><li>对偶图：可平面图的对偶图</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281cc8dcffa8851b5e4b1" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2817ca42defe37c131fd6"><li>顶点集：所有的<b>面</b></li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281db8d63c426e8dc6eb4"><li>每条边（可能有重边）：</li><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281db8d63c426e8dc6eb4"><li>如果原图中的某条边在两个面的边界中，那么在对偶图中这两个面对应的顶点有一条边</li><li>如果原图中的某条边在一个面的边界中，那么对应一个自环</li></ul></ul></ol></ol><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d2819b882fe0cdf909c332" data-id="35fa9ed6f2d2819b882fe0cdf909c332"><span><div id="35fa9ed6f2d2819b882fe0cdf909c332" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2819b882fe0cdf909c332" title="2 3 书中原题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">2 3 书中原题</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2819885c4c41660375673" style="list-style-type:decimal"><li>证明边数不小于点数的图都有圈（逐步删去度为 1 的顶点）。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2812a9fffd9499c0514a4" style="list-style-type:decimal"><li>证明最小度不小于 2 的图都有圈（从某个顶点出发的路可以一直延伸。由于顶点数量有限，所以一定会经过访问过的顶点，从而成环）。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d28157a206f1bf4d35ada7" style="list-style-type:decimal"><li>证明最小度不小于 k 的图都有至少 k+1 个点的圈（构造法）。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a69843c743177e22fb" style="list-style-type:decimal"><li>证明 2-正则图点连通度等于边连通度（边连通度为 2. 点连通度构造得 &lt;=2, 然后由于 2-正则图，因此任意两个顶点有两条不交路。&gt;=2）。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281998a57f16fc8ac0d31" style="list-style-type:decimal"><li>证明往点连通度为 p 的图加个点，这个点任意和其他 p 个点连边得到的新图点连通度和原图相同（trivial）。</li></ol><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d281a69a1ffccd6859f2a4" data-id="35fa9ed6f2d281a69a1ffccd6859f2a4"><span><div id="35fa9ed6f2d281a69a1ffccd6859f2a4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281a69a1ffccd6859f2a4" title="4 必考算法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">4 必考算法</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281218639f734d28933ed">二分图最大匹配的匈牙利算法和 HK 算法（书 59 页）</div><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281978222fd12679ef4e6" style="list-style-type:decimal"><li>匈牙利算法 (P60)：</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281978222fd12679ef4e6" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d28119ba21cf7d43e96c94"><li>思路：对左侧（X 集合）未匹配的点进行 DFS 找增广路，每次 do while 循环只找一条。</li></ul></ol></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815f9359dab5ef0a29ac" style="list-style-type:decimal"><li>HK 算法</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815f9359dab5ef0a29ac" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281698d28d3bbaefc11da"><li>思路：每次 do while 循环从左侧（X 集合）未匹配的点开始，进行 BFS。当找到第一条增广路时，记录其长度 d，并将终点加入 Y’ 集合中。当 BFS 的距离大于 d 时终止。然后从 Y’ 中的顶点按照 d 递减的顺序找到<b>互不相交</b>的增广路，同时进行增广。</li></ul></ol></ol><hr class="notion-hr notion-block-35fa9ed6f2d2814482b1d02baca5229c"/><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d281c497d9d430856c271f" data-id="35fa9ed6f2d281c497d9d430856c271f"><span><div id="35fa9ed6f2d281c497d9d430856c271f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281c497d9d430856c271f" title="知识点"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">知识点</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281d5a4efc1b9dcb052fd" style="list-style-type:decimal"><li>迹：边不重复出现的路线</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811a895bec41da1acbae" style="list-style-type:decimal"><li>路：点不重复出现的迹</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e6b45ed493be003b69" style="list-style-type:decimal"><li>割点的充要条件：对于连通图 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 和顶点 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，v 是 G 的割点当且仅当存在 V 的两个不相交的非空子集 Vi 和 Vj，对于任意顶点 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 和 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，每条 u-w 路都经过 v.</li></ol><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d2819ba942df49a2720e39" data-id="35fa9ed6f2d2819ba942df49a2720e39"><span><div id="35fa9ed6f2d2819ba942df49a2720e39" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2819ba942df49a2720e39" title="Algorithms"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Algorithms</span></span></h4><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d2811fb4a9faac2643ba88" data-id="35fa9ed6f2d2811fb4a9faac2643ba88"><span><div id="35fa9ed6f2d2811fb4a9faac2643ba88" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2811fb4a9faac2643ba88" title="Tarjan 算法求割点（P19）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Tarjan 算法求割点（P19）</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d2812e8305f61204673d20">DFS 魔改</div><div class="notion-text notion-block-35fa9ed6f2d281b5b36ad9b08f4d7df4">重要数据结构：<code class="notion-inline-code">dfn</code> <code class="notion-inline-code">low</code> 数组</div><div class="notion-text notion-block-35fa9ed6f2d28106bf59feb5899fd158"><code class="notion-inline-code">dfn</code> 数组记录每个节点的 DFS 序。有一个全局变量 <code class="notion-inline-code">time</code>，每当 DFS 访问到一个节点 u，更新 <code class="notion-inline-code">dfn</code> 数组为 <code class="notion-inline-code">dfn[u]=++time</code></div><div class="notion-text notion-block-35fa9ed6f2d281e39d25ffcc17ba2448"><code class="notion-inline-code">low</code> 数组记录每个节点<b>不经过父节点</b>（父节点指的是 DFS Tree 中的父节点），可以到达的节点中，<code class="notion-inline-code">dfn</code> 最小的一个。在两处更新该数组：1. 当 DFS 递归调用结束时更新，也就是一个节点的 low 值是其所有子节点的 low 值的最小值。2. 当遇到回边（即边的终点是访问过的顶点）时更新为当前 low 和该顶点 <code class="notion-inline-code">dfn</code> 的较小者。</div><div class="notion-text notion-block-35fa9ed6f2d281d29779d9d1b5b362f4">判定：</div><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281f8bafffdedf60b72c8"><li>根节点：有两个以上的子树，则是割点</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281ccb40fef94eaf62cf4"><li>其他节点：对边 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，v 为 u 在 DFS Tree 中的子节点，<code class="notion-inline-code">low[v] &gt;= dfn[u]</code>，u 是割点。（割开了以 v 为根的子树和 u 的 parent）</li></ul><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d2817c9e9df960cf93ff32" data-id="35fa9ed6f2d2817c9e9df960cf93ff32"><span><div id="35fa9ed6f2d2817c9e9df960cf93ff32" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2817c9e9df960cf93ff32" title="寻找欧拉迹"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">寻找欧拉迹</span></span></h4><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d2810398fdd211e107240f" data-id="35fa9ed6f2d2810398fdd211e107240f"><span><div id="35fa9ed6f2d2810398fdd211e107240f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d2810398fdd211e107240f" title="Fleury 算法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Fleury 算法</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281f4a18bf255c10aa0da">一句话总结：从奇度顶点出发（如果有），避免选择割边。</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d281c7a469f8be2f20ff55" data-id="35fa9ed6f2d281c7a469f8be2f20ff55"><span><div id="35fa9ed6f2d281c7a469f8be2f20ff55" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281c7a469f8be2f20ff55" title="Hierholzer 算法"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">Hierholzer 算法</span></span></h4><div class="notion-text notion-block-35fa9ed6f2d281e9bdefe78a9a6ab0e9">一句话：闭迹拼接</div><h4 class="notion-h notion-h3 notion-h-indent-0 notion-block-35fa9ed6f2d281cea82af9ad03d47dc1" data-id="35fa9ed6f2d281cea82af9ad03d47dc1"><span><div id="35fa9ed6f2d281cea82af9ad03d47dc1" class="notion-header-anchor"></div><a class="notion-hash-link" href="#35fa9ed6f2d281cea82af9ad03d47dc1" title="二级结论"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">二级结论</span></span></h4><ol start="1" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281eb9074ffd65308c6c5" style="list-style-type:decimal"><li>阶 ≥ 2 的简单图，至少有两个点的度相同。</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2815dbcbac169298a3a0f" style="list-style-type:decimal"><li>若 G 连通，则 G 补图可能连通可能不连通。若 G 不连通，则 G 补图一定连通。</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281e78db1ff779fa2658c" style="list-style-type:decimal"><li>若顶点 v 是 G 的割点，v 不是 G 补图的割点。</li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2811ebf3deedac2d1b031" style="list-style-type:decimal"><li>连通图的距离函数满足三角不等式。</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2816aaccffbe1912d5ee8" style="list-style-type:decimal"><li>连通图的两个顶点 u v，<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d2817387b2cee99a9c51e9" style="list-style-type:decimal"><li>连通图 G：<span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span></li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281f78064dba6c21bbf43" style="list-style-type:decimal"><li>二分图 G 连通当且仅当顶点集的划分唯一。</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a6be5ae0309bd83b84" style="list-style-type:decimal"><li>圈图的补图一定有哈密尔顿回路（n ≥ 5）。证明：n = 5 使用特判，n ≥ 6 使用 Dirac 定理或 Ore 定理。</li><ol class="notion-list notion-list-numbered notion-block-35fa9ed6f2d281a6be5ae0309bd83b84" style="list-style-type:lower-alpha"><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d281d99217d968d18bb29a"><li>Dirac 定理：若 G 的每个顶点度数至少为 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>，则 G 是哈密尔顿图</li></ul><ul class="notion-list notion-list-disc notion-block-35fa9ed6f2d2818683a1ea3e50c47d05"><li>Ore 定理：若 G 中任意两个不相邻的顶点度数之和至少为 n，则 G 是哈密尔顿图。</li></ul></ol></ol><div class="notion-text notion-block-35fa9ed6f2d281f8a24fd5cb51cf7042">若 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 连通，求 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span> 和 <span role="button" tabindex="0" class="notion-equation notion-equation-inline"><span></span></span>. (最大减少多少？)</div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>